拥有@static方法与不拥有它之间的区别

时间:2019-03-21 06:22:40

标签: python python-3.x python-decorators

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

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

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

注意:起初我忘记将self指定为foo()的参数,但是我将错误留在那里,因为答案是正确的。

2 个答案:

答案 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):

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