没有参数的类方法会产生TypeError

时间:2012-09-28 02:00:16

标签: python

此代码:

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    def test():
        print('test')

if __name__ == '__main__':
    x = testclass(2,3)

的产率:

Error:
TypeError:test() takes no argument(1 given)

我在没有任何参数的情况下调用测试函数,为什么错误说我已经给出了一个?

3 个答案:

答案 0 :(得分:7)

self传递给您的test方法:

def test(self):
    print('test')

您需要这样做,因为Python显式传递一个引用实例化对象的参数作为第一个参数。即使方法没有参数(因为指定了错误),也不应该省略它。

答案 1 :(得分:6)

您将方法称为self.test()。您应该在心理上将其转换为test(self),以了解如何在函数定义中“接收”该调用。您对test的定义只是def test()self没有位置,所以您得到了您观察到的错误。

为什么会这样?因为Python只能在专门给定要查找的对象时查找属性(并且查找属性包括方法调用)。因此,为了使方法能够执行任何取决于调用它的对象的内容,它需要以某种方式接收该对象。接收它的机制是它是第一个参数。

使用test装饰器可以告诉Python self根本不需要staticmethod。在这种情况下,Python知道该方法不需要self,因此它不会尝试将其作为第一个参数添加。因此,test的以下任一定义都可以解决您的问题:

def test(self):
    print('test')

OR:

@staticmethod
def test():
    print('test')

请注意,这仅适用于在对象上调用的方法(总是看起来像some_object.some_method(...))。正常的函数调用(看起来像function(...))没有“点的左边”,因此没有self,所以它不会自动传递。

答案 2 :(得分:1)

Python总是将实例作为实例方法的第一个参数传递,这意味着有时候关于参数数量的错误消息似乎是一个。

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    def test(self):          ## instance method
        print('test', self)

if __name__ == '__main__':
    x = testclass(2,3)

如果您不需要访问类或实例,可以使用staticmethod,如下所示

class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    @staticmethod
    def test():
        print('test')

if __name__ == '__main__':
    x = testclass(2,3)

如果您需要访问class,而不是实例

,则类方法类似
class testclass:
    def __init__(self,x,y):
        self.x = x
        self.y = y
        self.test()

    @classmethod
    def test(cls):
        print('test', cls)

if __name__ == '__main__':
    x = testclass(2,3)