为什么传递给 __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__
继承自 object
,str.__getattribute__
也是如此)。不过,它将查找您传入的字符串的属性,而不是与 SomeClass
.
相关的任何内容
唯一奇怪的行为是它说得到了零个参数(并且期望有一个),而不是说它得到了一个参数并且期望有两个。 问题的 部分可能是一个(小)错误。
您也可以尝试getattr(SomeClass, "a")
。在类似的情况下,这对我有用。
一个非常基本的问题。
我有一些假人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__
继承自 object
,str.__getattribute__
也是如此)。不过,它将查找您传入的字符串的属性,而不是与 SomeClass
.
唯一奇怪的行为是它说得到了零个参数(并且期望有一个),而不是说它得到了一个参数并且期望有两个。 问题的 部分可能是一个(小)错误。
您也可以尝试getattr(SomeClass, "a")
。在类似的情况下,这对我有用。