Python 为什么缺少object.\uuu getattr\uuu?

Python 为什么缺少object.\uuu getattr\uuu?,python,Python,为什么对象似乎没有\uuu getattr\uuu方法?它定义了\uuuuu setattr\uuuu和\uuuuu delattr\uuuuu。这不需要全部三个吗 >>> object.__setattr__ <slot wrapper '__setattr__' of 'object' objects> >>> >>> object.__delattr__ <slot wrapper '__delattr__' of

为什么
对象
似乎没有
\uuu getattr\uuu
方法?它定义了
\uuuuu setattr\uuuu
\uuuuu delattr\uuuuu
。这不需要全部三个吗

>>> 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]'
>>>对象__
>>> 
>>>对象__
>>> 
>>>对象。\u\u getattr__
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:类型对象“object”没有属性“\uuu getattr\uuuu”
>>>sys.version
“2.7.3(默认,2014年2月27日,19:58:35)\n[GCC 4.6.3]”

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

事实上,
对象
没有
\u getattr\u
方法

>>> import pprint
>>> pprint.pprint(dir(object))
['__class__',
 '__delattr__',
 '__doc__',
 '__format__',
 '__getattribute__',
 '__hash__',
 '__init__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__']
相反,它具有
\uuuu getattribute\uuuu

>>> object.__getattribute__
<slot wrapper '__getattribute__' of 'object' objects>
>>>对象。获取属性__
解释原因:

object.\uuu\getattribute\uuu(self,name)

无条件调用以实现类实例的属性访问。如果该类还定义了
\uuuuuGetAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
,则后者将不会被调用,除非
\uuuuuuuuuuuuuuuuuuuuuuuuGetAttribute\uuuuu

换句话说,如果您有
\uuuuu getattribute\uuuu
,那么同时定义
\uuuuuu getattr\uuuu
是没有意义的

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

从历史上看,
\uuuuuu getattr\uuuuu
是第一位的,而
\uuuuuuu getattribute\uuuuuuu
是在Python2.3(iirc)中通过“新样式类”引入的。Python3只有新样式的类,但似乎仍然保留了两个钩子(可能是因为只有在“正常属性访问”失败时才调用钩子比较方便)。

\uu getattr\uuuu
通常用于计算属性。例如,在访问模拟对象的属性时使用
\uuu getattr\uuuu
。@Dunes:That或
@property
/描述符。这完全取决于您试图创建的精确效果。最重要的是,
\uuuuuGetAttr\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。