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