簡體   English   中英

__setattr__和self .__ dict__之間的Python交互

[英]Python interaction between __setattr__ and self.__dict__

如果我創建這樣的類實例

class MyClass(object):
    pass
x = MyClass()

然后我可以在x上設置屬性如下:

x.myAttr = 1x.__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.

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