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

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

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

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

如果我直接在类上调用stat方法,则打印/显示下面的值。

StatMethoad.stat()
>>without Decorator


StatMethaod_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

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

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

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

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

请注意,每次从类或实例中检索属性时,都会发生从函数对象到(未绑定或绑定)方法对象的转换。 在某些情况下,富有成效的优化是将属性分配给局部变量并调用该局部变量。 另请注意,此转换仅适用于用户定义的函数; 其他可调用对象(以及所有不可调用对象)在没有转换的情况下被检索。 同样重要的是要注意,作为类实例属性的用户定义函数不会转换为绑定方法; 这只发生在函数是类的属性时。

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

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


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

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

链接地址: http://www.djcxy.com/p/9193.html

上一篇: Do we really need @staticmethod decorator in python to declare static method

下一篇: Can @staticmethod's be inherited?