AttributeError:ObjectT实例没有属性'__getitem__'

时间:2012-03-04 05:33:52

标签: python

    >>> 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__'

声明:classAInstanceClassA的标题,objectTInstanceObjectT的实例。

问题&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__的字典魔术函数。

这是对的吗?

谢谢

2 个答案:

答案 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那样行事。