为什么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]'
答案 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
是在本机代码中实现的,因此它可能会有所不同。