此代码:
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)
我在没有任何参数的情况下调用测试函数,为什么错误说我已经给出了一个?
答案 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)