我想覆盖__deepcopy__
给定的 SQLAlchemy 映射类,以便它忽略任何 SQLA 属性,但深度复制属于该类的所有其他内容。
我不是特别熟悉重写任何 Python 的内置对象,但我对我想要什么有所了解。
让我们创建一个User
使用 SQLA 映射的非常简单的类。
class User(object):
def __init__(self, user_id=None, name=None):
self.user_id = user_id
self.name = name
我曾经dir()
在映射之前和之后看到有哪些特定于 SQLAlchemy 的属性,并且我发现_sa_class_manager
了_sa_instance_state
.
Questions
如果这些是唯一的,我在定义时如何忽略它__deepcopy__
?
此外,SQLA 是否有任何属性注入到映射对象中?
(我在上一个问题中问过这个问题(不过,在我选择了主要问题的答案几天后进行了编辑),但我想我错过了那里的火车。为此道歉。)
Edit - Fixed code thanks to zifot's answer
我从 Python 文档中得到的唯一一件事是您需要将 deepcopy with 定义memo
为一个额外的参数。经过一点点挖掘后,我尝试了这个:
def __deepcopy__(self, memo):
dpcpy = self.__class__()
memo[id(self)] = dpcpy
for attr in dir(self):
if not attr.startswith('_'):
value = getattr(self, attr)
setattr(dpcpy, attr, copy.deepcopy(value, memo))
return dpcpy
然后我创建了一个实例User
:
snake = User(913, 'Snake,S.')
之后,我尝试了以下deepcopy
操作:
snake_dc = copy.deepcopy(snake)
...并且snake_dc
仍然具有 SQLA 属性...
我愿意提供帮助、建议等。