2017-08-10 105 views
1

一个非常基本的问题。为什么参数传递给__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> 
>>> 

回答

0

您调用的函数__getattribute__是一种方法。它预计两个的论点。第一个参数是self,通常是SomeClass的一个实例(当您通过实例调用时,通常会自动提供该实例:instance.__getattribute__)。第二个参数是要查找的属性的名称。

当您拨打SomeClass.__getattribute__("a")时,您通过"a"作为self。这不是一件非常有用的事情。如果您也提供了第二个参数,它可能甚至可以工作(因为从object继承,因为是str.__getattribute__)。它将查找您通过的字符串中的属性,而不是与SomeClass相关的任何属性。

唯一奇怪的行为是它说得到零个参数(和预期的一个),而不是说它得到一个参数和期望两个。 问题的一部分可能是(次要)错误。

+0

非常感谢您的解释。我对错误信息本身非常困惑。这是一个与\ __ setattr \ __类似的问题,如果我在调用这个(不正确的)方法时传递了两个参数,那么错误消息表明它需要2个参数,但只接收1个。(看起来它应该真的期待3个参数 - 实例,要设置的属性的名称以及将其设置为的值)。 – ffConundrums

+0

我怀疑是假的错误信息是因为那些是用C编写的方法(你从'object'继承)。内建的方法有点奇怪。如果你用Python编写你自己的方法,如果调用不正确,它会给出一个合适的错误信息。 – Blckknght

相关问题