簡體   English   中英

Python:__ setattr__用於舊式類?

[英]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__()方法的正確方法。

TL;博士

__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM