一个非常基本的问题。
我有一些虚拟课程:
class SomeClass:
""" just a docstring"""
a = 5
dir(SomeClass),返回与此类关联的以下属性:
>>> 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__被列为&#39; slotwrapper&#39;。这与它有关吗?我很难搞清楚调用slotwrapper和调用函数之间的真正区别。这个slotwrapper是否抛弃了我通过它的论点,因为我称之为它?
>>> SomeClass.__getattribute__
<slot wrapper '__getattribute__' of 'object' objects>
>>>
答案 0 :(得分:3)
您正在调用的函数__getattribute__
是一种方法。它需要两个参数。第一个参数是self
,它通常是SomeClass
的一个实例(通常在您通过实例调用时自动提供:instance.__getattribute__
)。第二个参数是要查找的属性的名称。
当您致电SomeClass.__getattribute__("a")
时,您将"a"
作为self
传递。这不是一件非常有用的事情。如果你也提供了第二个参数,它甚至可能有用(因为SomeClass.__getattribute__
继承自object
,因为str.__getattribute__
)。它将查找您传入的字符串的属性,而不是与SomeClass
相关的任何内容。
唯一奇怪的行为是它说零参数(和预期的一个),而不是说它有一个参数并且预期有两个参数。 该部分问题可能是(次要)错误。
答案 1 :(得分:0)
您也可以尝试getattr(SomeClass, "a")
。在类似的情况下,这对我有用。