在Python 3.x中我可以用bar()
做什么,我不能用foo()
做什么?
class A:
def foo():
print("some code")
@staticmethod
def bar():
print("some code")
注意:我最初忘了指定self
作为foo()
的参数,但我将错误留在那里,因为答案和。
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
s用于应该对类及其实例有帮助的方法,但不需要知道任何一个。通常我将它们用作实用功能。
请注意,第三个版本是classmethod
,它类似于常规方法,因为它默认接受第一个参数 - 调用者的类。在这种情况下,最小签名是
@classmethod
def operateOnClass(cls):
使用此选项进行影响所有实例的更改,例如更改类变量。
可以从未实例化的类对象中调用bar()
。 foo()
需要以self
作为参数,因此只能从已经声明为class A
实例的对象中调用