一个非常基本的问题。为什么参数传递给__getattribute__无法识别?
我有一些虚拟类:
class SomeClass:
""" just a docstring"""
a = 5
目录(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__被列为'slotwrapper'。这是否与它有关?我很难弄清楚调用slotwrapper和调用函数之间的真正区别。由于我调用它的方式,这个slotwrapper抛弃了我通过它的论点吗?
>>> SomeClass.__getattribute__
<slot wrapper '__getattribute__' of 'object' objects>
>>>
非常感谢您的解释。我对错误信息本身非常困惑。这是一个与\ __ setattr \ __类似的问题,如果我在调用这个(不正确的)方法时传递了两个参数,那么错误消息表明它需要2个参数,但只接收1个。(看起来它应该真的期待3个参数 - 实例,要设置的属性的名称以及将其设置为的值)。 – ffConundrums
我怀疑是假的错误信息是因为那些是用C编写的方法(你从'object'继承)。内建的方法有点奇怪。如果你用Python编写你自己的方法,如果调用不正确,它会给出一个合适的错误信息。 – Blckknght