我想重寫__deepcopy__
對於一個給定的SQLAlchemy映射類,使它忽略任何SQLA屬性,但是深入瞭解類的一部分。如何在Python中「覆蓋」deepcopy?
我不是特別熟悉重寫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文檔的唯一的事情是,你需要用memo
定義deepcopy的一個額外的參數。周圍挖的卻有點後,我嘗試了這一點:
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屬性...
我很樂意提供幫助,建議等
對不起,你是什麼意思 「參數的構造函數」 是什麼意思? – PizzAzzra 2010-06-14 12:09:44
對不起。一個'__init__',它不需要超出自身的變量。查看zifot的答案作爲例子。 – mavnn 2010-06-14 12:19:10
他的意思是說你的User .__ init__函數(「構造函數」,雖然技術上它不是構造函數)有三個參數:self,user_id和name,但是當你調用self .__ class __()時,你只傳遞第一個一個(隱含地)。 – zifot 2010-06-14 12:21:52