在Python 3.x中,我可以使用bar()
来做什么,而不能使用foo()
呢?
class A:
def foo():
print("some code")
@staticmethod
def bar():
print("some code")
注意:起初我忘记将self
指定为foo()
的参数,但是我将错误留在那里,因为答案是正确的。
答案 0 :(得分:3)
bar()
。 foo()
需要作为参数输入self
,因此只能从已经声明为class A
实例的对象中调用
答案 1 :(得分:3)
staticmethod
是不需要对象作为其第一个参数的方法。这意味着它是对类本身及其所有实例有用的方法,而不仅仅是类的实例(对象初始化为A()
。
实际上,这意味着Python不会隐式发送对象本身作为参数。调用后,第一个方法将中断:
>>> a.foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() takes 0 positional arguments but 1 was given
这是因为Python为对象方法提供了对象本身作为第一个参数。因此,普遍存在的自我论证:
def foo(self): #Proper signature
另一方面,
A.bar()
就可以了,
a.bar()
该对象未作为第一个参数提供。使用staticmethod
来表示应该对类及其实例有用的方法,但不需要二者之一。通常我将它们用作实用程序功能。
请注意,存在第三个版本,classmethod
与常规方法类似,因为它默认情况下接受第一个参数-调用者的类。在这种情况下,最小签名是
@classmethod
def operateOnClass(cls):
使用它进行影响所有实例的更改,例如更改类变量。