![](/img/trans.png)
[英]Python: __setattr__ as class-method // self.__dict__ assignment on a metaclass
[英]Python interaction between __setattr__ and self.__dict__
如果我創建這樣的類實例
class MyClass(object):
pass
x = MyClass()
然后我可以在x上設置屬性如下:
x.myAttr = 1
或x.__setattr__('myAttr', 1)
但是,如果我做一個字典
d = {}
我無法設置它的屬性。 例如,如果我這樣做
d.__setattr__('myAttr', 1)
我得到錯誤“'dict'對象沒有屬性'myAttr'”如果我嘗試同樣的事情發生
d.myAttr = 1
我注意到在x.myAttr = 1的情況下實際發生的是
x.__dict__
使用新密鑰進行更新,因此必須如此
d.__setattr__
不起作用,因為d沒有
d.__dict__
僅僅因為d 是一個字典。 如果有人能夠徹底解釋這里發生了什么,我將非常感激。
所有python對象都有.__dict__
嗎?
為什么我嘗試調用d.__setattr__
導致錯誤說該屬性不存在?
是否有我應該知道的特定內置類型的層次結構? 一個簡單的參考將非常感激。
python 2.6.4
Windows XP Pro x64 SP2
dict
實例沒有__dict__
屬性,因此您無法為其指定屬性。 Python的大多數內置類(用C編寫並以不同方式定義屬性)都沒有。 如果你繼承dict
,子類將具有__dict__
屬性,然后您可以將屬性添加到子類的實例。
從docs.python.org復制粘貼:
每個模塊的特殊屬性是__dict__。 這是包含模塊符號表的字典。 修改這個字典實際上會改變模塊的符號表,但不能直接賦值給__dict__屬性(你可以寫m .__ dict __ ['a'] = 1,它將ma定義為1,但你不能寫m .__ dict__ = {})。 不建議直接修改__dict__。
http://docs.python.org/library/stdtypes.html
方法
兩條線都是一樣的:
x.__setattr__('a', b)
x.a = b
像__ add__是:
x.__add__(b)
x + b
但是,您可以將dict .__ setattr__函數重新定義為您想要的任何內容
編輯第3條評論:
class x(object):
def __init__(self):
pass
def __setattr__(self, a, b):
print "nope, i will not set the attribute %s = %s" % (a,b)
c = x()
c.a = 4
print c.__dict__
將打印“nope,我不會設置屬性a = 4而c.__dict__
將沒有屬性'a'
例外說明:
>>> class C(object):
... __slots__ = ('a', 'b')
...
>>> c = C()
>>> c.a = 1
>>> c.t = 2
Traceback (most recent call last):
File "<input>", line 1, in <module>
AttributeError: 'C' object has no attribute 't'
這里描述的插槽
self.__dict__
是一個dict
。 假設, dict
也有__dict__
,它是一個遞歸定義,事情不會起作用:-)
如果你做x.myAttr = 1
,你真的在做x.__dict__['myAttr'] = 1
。 如果你做了x.__dict__.myAttr
你會得到與d.myAttr
相同的錯誤。 的。 attribute
賦值是為類而不是dicts定義的 - dict賦值是通過d['attribute']
來代替的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.