class Test():
myVersion="1.0"
t=Test()
t.myVersion
--> 1.0
Test.myVersion="2.0"
Test.x={'myVersion':'1.0'}
Test.x
--> {'myVersion': '1.0'}
t.x
--> {'myVersion': '1.0'}
del t.x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: Test instance has no attribute 'x'
Run Code Online (Sandbox Code Playgroud)
为什么实例没有属性x?
{'myVersion':'1.0'}不属于归属?
在Python,无论是class和instance属性是从实例进行访问.
参考Class instances在http://docs.python.org/2/reference/datamodel.html阐明如何工作-
通过调用类对象来创建类实例(参见上文).类实例具有作为字典实现的名称空间,该字典是搜索属性引用的第一个位置.当在那里找不到属性,并且实例的类具有该名称的属性时,搜索继续使用类属性.
您可以分别使用Test.__dict__和查看您的类和实例的命名空间t.__dict__.
有趣的是,如果通过从实例引用类属性来修改类属性,则class属性将保持不受影响.相反,具有更改的属性的副本将添加到实例的命名空间.
例如,
>>> t = Test()
>>> t.myVersion = "2.0"
>>> Test.__dict__
{'__module__': '__main__', 'myversion': '1.0', '__doc__': None}
>>> t.__dict__
{'myVersion': '2.0'}
Run Code Online (Sandbox Code Playgroud)
myVersion属性现在存在于Test(类)和t(实例)的命名空间中,并且可以安全地从任一个中删除而不会引发AttributeError.
基本思想是,您尝试从对象中删除的变量应该存在于其名称空间中.
| 归档时间: |
|
| 查看次数: |
590 次 |
| 最近记录: |