我们真的需要python中的@staticmethod decorator来声明静态方法吗

我们真的需要python中的@staticmethod decorator来声明静态方法吗,python,static,Python,Static,我很好奇为什么我们需要@staticmethod装饰器将方法声明为static。我在读Python中的静态方法,我知道静态方法可以在不实例化其类的情况下调用。 所以我尝试了下面的两个例子,但都是一样的: class StatMethod: def stat(): print("without Decorator") class StatMethod_with_decorator: @staticmethod def stat(): print("With Decor

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

如果要尝试从类的实例而不是直接从类调用
@staticmethod
,则需要decorator

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的方法,这是不同的:

静态方法对象提供了一种阻止 函数对象到上述方法对象。静态方法 对象是任何其他对象(通常是用户定义的对象)的包装器 方法对象。从类检索静态方法对象时 或者类实例,实际返回的对象是包装的 对象,该对象不受任何进一步转换的约束。静止的 方法对象本身不可调用,尽管对象 包装通常是。静态方法对象由内置的 staticmethod()构造函数


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

或两者兼而有之:

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

现在用一个带有一些参数的函数来尝试一下……这可能会有所帮助:注意,我在一些测试中发现,当函数有arg时,Python2.7需要使用decorator,而Python3没有。Python2.7尝试将第一个参数与实例匹配(它认为它是自己的),而Python3似乎理解一个参数只是函数的参数,而不必为此使用注释。我在文档中没有发现任何关于这种特定差异的内容。对于python 3,即使使用了一些参数,静态方法的调用也会起作用(不会失败)。您知道是否存在一个已建立或约定的术语来引用静态方法,您只能通过类名直接调用这些方法?或者社区仅仅称这两种方法为“静态方法”?是否与这些术语在Java、C#或其他地方的使用方式有关?还有,你会说他们的主要目的是用装饰器定义的静态方法吗?那么,当我们只通过类而不是通过实例对象使用这个方法时,@ Stasic方法是可选的?如果你不打算使用它,我会认为它是一个反模式来接受一个方法的参数。因此,在这种情况下,接受
自我
但不使用它属于这一类。因此,将该方法设置为静态是规范的。
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")