在Python中声明静态方法需要@staticmethod装饰器吗?

0pizxfdo  于 2023-05-21  发布在  Python
关注(0)|答案(5)|浏览(185)

我很好奇为什么我们需要@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
bxfogqkk

bxfogqkk1#

如果您打算尝试从类的示例而不是直接从类调用@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

现在,如果我声明@staticmethodself参数不会作为第一个参数隐式传递

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

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

tyu7yeag2#

文档描述了在调用用户定义的方法时执行的一些转换:
请注意,每次从类或示例检索属性时,都会发生从函数对象到(未绑定或绑定)方法对象的转换。在某些情况下,富有成效的优化是将属性分配给局部变量并调用该局部变量。还要注意,这种转换只发生在用户定义的函数上;其他可调用对象(和所有不可调用对象)被检索而不进行变换。同样重要的是要注意,作为类示例属性的用户定义函数不会转换为绑定方法;只有当函数是类的一个属性时,才会发生这种情况。
对于标记为staticmethod的方法,这是不同的:
静态方法对象提供了一种击败上述函数对象到方法对象的转换的方法。静态方法对象是任何其他对象的 Package 器,通常是用户定义的方法对象。当从类或类示例检索静态方法对象时,实际返回的对象是 Package 对象,它不受任何进一步转换的影响。静态方法对象本身不是可调用的,尽管它们 Package 的对象通常是可调用的。静态方法对象由内置的staticmethod()构造函数创建。

am46iovg

am46iovg3#

如果函数有参数,那么调用非静态方法将失败
静态方法没有使用类中的局部变量,但类方法将使用

nfg76nw0

nfg76nw04#

更新:在python3.10中,你不再需要装饰器了

ax6ht2ek

ax6ht2ek5#

这是我的简单方法。别管那些装修工了。直接使用类(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")

相关问题