类和对象都有__dict__属性,用于存储类和对象的所有属性。但是二者的__dict__是不一样的。
最大的不同是:类的__dict__不允许手动直接修改,而对象的__dict__允许手动直接修改.
比如:
class Myclass():
def __init__(self):
self.x = 1
myobject = Myclass()
myobject.y = 2 # okay
myobject.__dict__['y']=3 # okay
Myclass.z = 2 # okay
Myclass.__dict__['z']=3 #TypeError: 'mappingproxy' object does not support item assignment
为了让类的__dict__
没法被手动改,python把类的__dict__
设定为 mappingproxy
(python3) 或者dictproxy
(python2)。 mappingproxy
和dictproxy
只是名字不同,没有区别。
Reference:
- https://stackoverflow.com/questions/39687713/what-the-difference-between-dict-proxy-in-python2-and-mappingproxy-in-python3
- https://stackoverflow.com/questions/25440694/whats-the-purpose-of-dictproxy