AttributeError:ObjectT实例没有属性'\u getitem''

2024-10-01 09:35:47 发布

您现在位置: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的实例。

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

这是对的吗?

谢谢你


Tags: 方法gtreduceobjectaccessdirmethoddict
2条回答

当通过您尝试的第一个方法访问属性时,Python首先检查__dict__以查看属性是否在其中。如果是,那就是它的用途。然后检查对象的__class____dict__。如果仍然找不到,它将继续搜索超类。(如果涉及多重继承,则会变得更复杂。)如果仍然找不到它,则会查找类或任何超类的__getattr__,并调用该类来获取属性。如果所有这些都失败了,那就错了。

第二个方法直接访问对象的__dict__。它不会像第一个那样检查类的属性或调用__getattr__

第三种方法完全是另一种方法;它试图调用__getitem__(不要把它与__getattr__混淆)。

造成混淆的原因是,dictionary对象具有指向dictionary的__dict__属性。对象和它的__dict__属性不是同一个字典。

大多数Python对象都有一个用于存储对象属性的__dict__属性;这些属性使用.语法访问(该语法搜索对象的__dict__及其类和派生的类)。当您的对象是一个字典时,它本身也存储项使用[...]语法访问它们。

可以在dict子类上编写__getattr__()__setattr__()方法,允许使用点符号(一种la JavaScript)访问字典中的项。这通常是个坏主意,因为Python程序员不希望Python表现得像JavaScript。

相关问题 更多 >