@staticmethod和没有它之间的区别

问题描述 投票:1回答:2

在Python 3.x中我可以用bar()做什么,我不能用foo()做什么?

class A:
    def foo():
        print("some code")

    @staticmethod
    def bar():
        print("some code")

注意:我最初忘了指定self作为foo()的参数,但我将错误留在那里,因为答案和。

python python-3.x python-decorators
2个回答
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()

该对象不作为第一个参数提供。将staticmethods用于应该对类及其实例有帮助的方法,但不需要知道任何一个。通常我将它们用作实用功能。

请注意,第三个版本是classmethod,它类似于常规方法,因为它默认接受第一个参数 - 调用者的类。在这种情况下,最小签名是

@classmethod
def operateOnClass(cls):

使用此选项进行影响所有实例的更改,例如更改类变量。


3
投票

可以从未实例化的类对象中调用bar()foo()需要以self作为参数,因此只能从已经声明为class A实例的对象中调用

© www.soinside.com 2019 - 2024. All rights reserved.