为什么对象.__ getattr__丢失了?

时间:2015-02-15 20:47:31

标签: python

为什么object似乎没有__getattr__方法?它定义了__setattr____delattr__。它不需要这三个吗?

>>> object.__setattr__
<slot wrapper '__setattr__' of 'object' objects>
>>> 
>>> object.__delattr__
<slot wrapper '__delattr__' of 'object' objects>
>>> 
>>> object.__getattr__
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'object' has no attribute '__getattr__'
>>> sys.version
'2.7.3 (default, Feb 27 2014, 19:58:35) \n[GCC 4.6.3]'

2 个答案:

答案 0 :(得分:7)

确实,object没有__getattr__方法。

>>> import pprint
>>> pprint.pprint(dir(object))
['__class__',
 '__delattr__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__']

相反,它有__getattribute__

>>> object.__getattribute__
<slot wrapper '__getattribute__' of 'object' objects>

https://docs.python.org/2/reference/datamodel.html#object.__getattribute__解释了原因:

  

object.__getattribute__(self, name)

     
    

无条件调用以实现类实例的属性访问。如果该类还定义了__getattr__(),则除非__getattribute__()明确调用它或引发AttributeError,否则不会调用后者。

  

换句话说,如果您有__getattribute__,那么定义__getattr__也没有意义。

从历史上看,__getattr__排在第一位,__getattribute__引入了&#34;新式课程&#34;在Python 2.3(iirc)中。 Python 3只有新式的类,但似乎保留了两个钩子(也许是因为如果&#34;正常属性访问&#34;失败,那么只有只调用的钩子会很方便)。

答案 1 :(得分:3)

__getattr__是仅在__getattribute__之后运行的方法。由于object具有后者,因此技术上不需要前者。但总的来说,你不应该期望object拥有其他对象(从中派生出来)拥有的所有东西。由于object是在本机代码中实现的,因此它可能会有所不同。