>>> dir(classAInstance.objectTInstance.__dict__)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__',
'__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__',
'__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__setitem__', '__str__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems',
'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> classAInstance.objectTInstance.attB # Access Method 1
199
>>> classAInstance.objectTInstance.__dict__['attB'] # Access Method 2
199
>>> classAInstance.objectTInstance['attB'] # Access Method 3
Traceback (most recent call last):
File "<input>", line 1, in ?
AttributeError: ObjectT instance has no attribute '__getitem__'
声明:classAInstance
是ClassA
的标题,objectTInstance
是ObjectT
的实例。
问题&gt; classAInstance.objectTInstance
在哪里存储属性attB
?
为什么访问方法3不起作用? __dict__
确实存储了什么?
object.__dict__
A dictionary or other mapping object used to store an object’s (writable) attributes.
根据我的理解,Access方法1和2完全相同。 attB
也存储在__dict__
对象的ObjectT
中。为了使Access 3工作,ObjectT必须提供一个名为__getitem__
的字典魔术函数。
这是对的吗?
谢谢
答案 0 :(得分:3)
通过您尝试的第一种方法访问属性时,Python首先检查__dict__
以查看属性是否在那里。如果是,那就是它的用途。然后它检查对象的__dict__
的{{1}}。如果仍未找到,则继续搜索超类。 (如果涉及多重继承,则会变得更复杂。)如果仍未找到它,则会查找该类的__class__
或任何超类,并调用它来获取该属性。如果所有这些都失败了,那就错了。
第二种方法直接访问对象的__getattr__
。它不会检查类的属性,也不会像第一个那样调用__dict__
。
第三种方法完全不同于其他方法;它会尝试拨打__getattr__
(不要将其与__getitem__
混淆)。
答案 1 :(得分:1)
您混淆的原因是您有一个字典对象,其__dict__
属性也指向字典。 您的对象及其__dict__
属性不是同一个字典。
大多数Python对象都有__dict__
属性,用于存储对象的属性;使用.
语法(搜索对象的__dict__
及其类及其派生类)可以访问这些属性。当您的对象是字典时,它还会将项目存储在其中。使用[...]
语法访问这些项目。
可以在__getattr__()
子类上编写__setattr__()
和dict
方法,这些方法也允许使用点符号(即JavaScript)访问字典中的项目。这通常是一个坏主意,因为Python程序员不希望Python像JavaScript那样行事。