为什么传递给 __getattribute__ 的参数无法识别?

Why is the argument passed to __getattribute__ not recognized?

一个非常基本的问题。

我有一些假人class:

class SomeClass:
    """ just a docstring"""

    a = 5

dir(SomeClass),returns 与此 class 关联的以下属性:

>>> dir(SomeClass)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__form
at__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_s
ubclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__',
 '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclas
shook__', '__weakref__', 'a']
>>>

我注意到,如果我调用 SomeClass.__getattribute__,即使我向它传递了一个参数(它说它需要),错误消息说我没有传递任何参数争论.

>>> SomeClass.__getattribute__('a')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: expected 1 arguments, got 0
>>>

注意 - 我并不是想以这种方式调用 __getattribute__ 的用例。(实际上这样做似乎不正确,我而是想在 SomeClass 的实例上调用它,这确实有效)。 我只是对 __getattribute__ 的行为感到好奇:为什么错误消息说它有 0 个参数,而实际上我正在向它传递一个参数? 我不是争论我的用法不正确 - 只是,为什么 __getattribute__ 没有意识到它被传递了一个参数?

我确实注意到 __getattribute__ 被列为 'slotwrapper'。这有关系吗?我很难弄清楚调用 slotwrapper 和调用函数之间的真正区别是什么。这个 slotwrapper 是否因为我调用它的方式而抛弃了我传递给它的论点?

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

您正在调用的函数 __getattribute__ 是一个方法。它需要 两个 个参数。第一个参数是 self,它通常是 SomeClass 的实例(并且通常在您通过实例调用时自动提供:instance.__getattribute__)。第二个参数是要查找的属性的名称。

当您调用 SomeClass.__getattribute__("a") 时,您将 "a" 作为 self 传递。这不是一件很有用的事情。如果您也提供了第二个参数,它甚至可能有效(因为 SomeClass.__getattribute__ 继承自 objectstr.__getattribute__ 也是如此)。不过,它将查找您传入的字符串的属性,而不是与 SomeClass.

相关的任何内容

唯一奇怪的行为是它说得到了零个参数(并且期望有一个),而不是说它得到了一个参数并且期望有两个。 问题的 部分可能是一个(小)错误。

您也可以尝试getattr(SomeClass, "a")。在类似的情况下,这对我有用。