我想覆蓋我的Python類的__getattribute__
和__setattr__
方法。我的用例是通常的用例:我有一些我想處理的特殊名稱,並且我需要其他任何默認行爲。對於__getattribute__
,似乎我可以簡單地通過提高AttributeError
來請求默認行爲。但是,如何在__setattr__
中實現相同?這裏是一個簡單的例子,實現一個具有不可變字段「A」,「B」和「C」的類。如何正確地覆蓋Python中新樣式類的__setattr__和__getattribute__?
class ABCImmutable(SomeSuperclass):
def __getattribute__(self, name):
if name in ("A", "B", "C"):
return "Immutable value of %s" % name
else:
# This should trigger the default behavior for any other
# attribute name.
raise AttributeError()
def __setattr__(self, name, value):
if name in ("A", "B", "C"):
raise AttributeError("%s is an immutable attribute.")
else:
# How do I request the default behavior?
???
什麼代替了問號?對於舊式課程,答案顯然是self.__dict__[name] = value
,但是文檔表明這對於新式課程來說是錯誤的。
」文檔表明這對於新式班級來說是錯誤的......「並且這並不表示新式班級適合什麼嗎? – Gerrat
爲什麼你不只是實現你的命名字段作爲集合屬性? – katrielalex
不變性僅僅是__setattr__的簡單示例用例。我的實際使用情況有點複雜。我的類繼承了字典,但另外,某些特殊鍵(在運行時確定)可以通過'object.key'而不是'object ['key']'來訪問。我可以使用運行時反射或其他方法將它們添加爲屬性,但使用'__getattr__'和'__setattr__'更容易,性能也不是特別重要。 –