@StaticMethod装饰器是否需要在Python中声明静态方法



我很好奇为什么我们需要@staticmethod装饰器将方法声明为静态。

我正在阅读有关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

如果您打算尝试从类实例调用@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

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

请注意,从函数对象转换为(未结合或 界(方法对象每次从属性中检索 类或实例。在某些情况下,富有成果的优化是 将属性分配给本地变量并调用该局部变量。 另请注意,此转换仅发生在用户定义的 功能;其他可呼叫的对象(以及所有不可容易的对象(是 检索没有转换。同样重要的是要注意 用户定义的函数是类实例的属性 未转换为绑定方法;仅当功能是 班级的属性。

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

静态方法对象提供了一种击败转换的方法 功能对象到上述方法对象。静态方法 对象是围绕任何其他对象的包装器,通常是用户定义的 方法对象。从类检索静态方法对象时 或类实例,实际返回的对象是包装 对象,不受任何进一步的转换。静止的 方法对象本身不是可召唤的,尽管它们的对象 包裹通常是。静态方法对象由内置创建 staticMethod((构造函数。

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

和静态方法没有使用类中的本地变量,但是类方法将为

更新:在python 3.10中,您不需要

只是我在这里简单的方法。忘记装饰者。直接使用类(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")

最新更新