我们真的需要python中的@staticmethod装饰器来声明静态方法

时间:2017-04-24 11:37:44

标签: python static

我很好奇为什么我们需要@staticmethod装饰器将方法声明为static。我正在阅读Python中的静态方法,并且我开始知道静态方法可以在不实例化其类的情况下进行调用。 所以我尝试了下面的两个例子,但两者都是一样的:

class StatMethod:
  def stat():
    print("without Decorator")

class StatMethod_with_decorator:
  @staticmethod
  def stat():
    print("With Decorator")

如果我直接在类上调用stat()方法,则打印/显示以下值:

>> StatMethod.stat()
without Decorator
>> StatMethod_with_decorator.stat()
With Decorator

4 个答案:

答案 0 :(得分:29)

如果您打算尝试从类的实例而不是类直接调用@staticmethod,则需要装饰器

class Foo():
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
Traceback (most recent call last):
  File "<pyshell#7>", line 1, in <module>
    f.bar(4)
TypeError: bar() takes 1 positional argument but 2 were given

现在,如果我声明@staticmethod self参数未被隐式传递为第一个参数

class Foo():
    @staticmethod
    def bar(x):
        return x + 5

>>> f = Foo()
>>> f.bar(4)
9

答案 1 :(得分:2)

documentation描述了在调用用户定义的方法时完成的一些转换:

  

请注意,从函数对象转换为(未绑定或   每次从中检索属性时都会发生方法对象   类或实例。在某些情况下,卓有成效的优化是   将属性分配给局部变量并调用该局部变量。   另请注意,此转换仅适用于用户定义的   功能;其他可调用对象(以及所有不可调用对象)   无需转换即可检索值得注意的是,这一点也很重要   用户定义的函数是类实例的属性   没有转换为约束方法;这只在函数发生时发生   该类的一个属性。

对于标记为staticmethod的方法,这是不同的:

  

静态方法对象提供了一种破坏转换的方法   函数对象到上面描述的方法对象。静态方法   object是任何其他对象的包装器,通常是用户定义的   方法对象。从类中检索静态方法对象时   或者一个类实例,实际返回的对象是包装的   对象,不受任何进一步的转变。静态的   方法对象本身不可调用,尽管它们是对象   通常包裹。静态方法对象由内置函数创建   staticmethod()构造函数。

答案 2 :(得分:1)

如果函数有一些参数,则调用非静态方法将失败

和静态方法没有使用类中的局部变量,但类方法将是

答案 3 :(得分:0)

这只是我的简单方法。忘了装饰。直接使用该类(Python 3.8):

class MyClass:
    def myMethod(self, myValue):
        print(myValue)

MyClass.myMethod(None, "hi")

或两者皆是

MyClass.myMethod(None, "hi from class")
myInstance = myClass()
myInstance.myMethod2("hi from instance")