>>> 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
的实例。
问题>;classAInstance.objectTInstance
在哪里存储属性attB
?
为什么访问方法3不起作用?__dict__
到底存储什么?
object.__dict__
A dictionary or other mapping object used to store an object’s (writable) attributes.
根据我的理解,访问方法1和2完全相同。而且attB
存储在ObjectT
对象的__dict__
中。为了使Access 3工作,ObjectT必须提供一个名为__getitem__
的字典魔术函数。
这是对的吗?
谢谢你
当通过您尝试的第一个方法访问属性时,Python首先检查
__dict__
以查看属性是否在其中。如果是,那就是它的用途。然后检查对象的__class__
的__dict__
。如果仍然找不到,它将继续搜索超类。(如果涉及多重继承,则会变得更复杂。)如果仍然找不到它,则会查找类或任何超类的__getattr__
,并调用该类来获取属性。如果所有这些都失败了,那就错了。第二个方法直接访问对象的
__dict__
。它不会像第一个那样检查类的属性或调用__getattr__
。第三种方法完全是另一种方法;它试图调用
__getitem__
(不要把它与__getattr__
混淆)。造成混淆的原因是,dictionary对象具有指向dictionary的
__dict__
属性。对象和它的__dict__
属性不是同一个字典。大多数Python对象都有一个用于存储对象属性的
__dict__
属性;这些属性使用.
语法访问(该语法搜索对象的__dict__
及其类和派生的类)。当您的对象是一个字典时,它本身也存储项。使用[...]
语法访问它们。可以在
dict
子类上编写__getattr__()
和__setattr__()
方法,允许使用点符号(一种la JavaScript)访问字典中的项。这通常是个坏主意,因为Python程序员不希望Python表现得像JavaScript。相关问题 更多 >
编程相关推荐