2017-04-24 55 views
2

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

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 
+0

现在尝试一个函数,需要一些参数... –

+0

这可能有所帮助:http:// stackoverflow。COM /问题/ 136097 /什么,是最差静态方法之间 - 和 - 类方法 - 在 - 蟒蛇 – Kendas

回答

5

您需要的装饰,如果你打算尝试从类的实例,而不是直接类

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如果我声明@staticmethodself说法是不作为第一个参数隐式传递

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

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

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

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

2

documentation介绍了一些转换被调用用户定义的方法时做到:

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

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

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

相关问题