[英]Python: __setattr__ for old-style classes?
如何在舊式類上執行__setattr__的等效操作?
如果你想要做的是設置舊樣式類實例的屬性,你可以使用setattr
內置函數,它也適用於舊式類。 示例 -
>>> class Foo:
... def __init__(self,blah):
... self.blah=blah
...
>>> foo = Foo("Something")
>>> foo.blah
'Something'
>>> setattr(foo,'blah','somethingElse')
>>> foo.blah
'somethingElse'
您應該使用內置函數,例如任何類型的類。
由於原始問題接受“......等效方法”,我想展示在舊式類中實現特殊__setattr__()
方法的正確方法。
在__setattr__(self, attr_name, attr_value)
方法中使用self.__dict__[attr_name] = attr_value
。
__setattr__()
符合舊式班級 有趣的是,Python 2.7和3 都調用了舊式類定義的__setattr__()
方法。 但是,與舊式類不同,舊式類不提供默認的__setattr__()
方法。 令人驚訝的是,這在舊式類__setattr__()
方法變得非常復雜。
在子類__setattr__()
一個新式類的,超__setattr__()
通常被稱為在端部,設置所需的屬性。 在__setattr__()
類的子類__setattr__()
中,這通常會引發異常; 在大多數情況下, 沒有超__setattr__()
相反,必須手動設置特殊__dict__
實例變量的所需鍵值對。
考慮一個偉大的舊式類,類似於“有__setattr__()
的伍茲的黑山羊”這個短語,並定義__setattr__()
以通過la_
為傳遞的屬性名稱加前綴:
class ShubNiggurath:
def __setattr__(self, attr_name, attr_value):
# Do not ask why. It is not of human purport.
attr_name = 'la_' + attr_name
# Make it so. Do not call
# super(ShubNiggurath, self).__setattr__(attr_name, attr_value), for no
# such method exists.
self.__dict__[attr_name] = attr_value
奇怪的是,舊式類確實提供了一個默認的__getattr__()
方法。 Python 2.7如何允許這種淫穢不對稱的立場不值得思考 - 因為它同樣是可怕和可恥的!
但它是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.