为什么我们使用@staticmethod?

Ken*_*n T 5 python

我只是不明白为什么我们需要使用@staticmethod.让我们从一个例子开始吧.

class test1:
    def __init__(self,value):
        self.value=value

    @staticmethod
    def static_add_one(value):
        return value+1

    @property
    def new_val(self):
        self.value=self.static_add_one(self.value)
        return self.value


a=test1(3)
print(a.new_val) ## >>> 4



class test2:
    def __init__(self,value):
        self.value=value

    def static_add_one(self,value):
        return value+1

    @property
    def new_val(self):
        self.value=self.static_add_one(self.value)
        return self.value


b=test2(3)
print(b.new_val) ## >>> 4
Run Code Online (Sandbox Code Playgroud)

在上面的示例static_add_one中,两个类中的方法在计算中不需要类(self)的实例.

该方法static_add_one在类test1是由装饰@staticmethod和正常工作.

但与此同时,static_add_onetest2中没有@staticmethod装饰的方法也可以通过使用self在参数中提供但完全不使用它的技巧来正常工作.

那么使用的好处是@staticmethod什么?它会改善性能吗?或者仅仅是因为python的禅宗指出" 明确比隐含更好 "?

Bre*_*arn 17

使用的原因staticmethod是如果你有一些东西可以写成一个独立的函数(不是任何类的一部分),但你想把它保留在类中,因为它在某种程度上在语义上与类相关.(例如,它可能是一个函数,不需要来自类的任何信息,但其行为特定于类,因此子类可能希望覆盖它.)在许多情况下,它可能同样有意义写一些东西作为独立的函数而不是静态方法.

你的例子并不完全相同.一个关键的区别是,即使你不使用self,你仍然需要一个实例来调用static_add_one---你不能直接在类上调用它test2.static_add_one(1).因此,在那里有一个真正的差异.静态方法最严重的"竞争对手"不是一种忽略的常规方法self,而是一种独立的功能.

  • +1 这是目标。我们使用静态方法将常规函数附加到类。这提高了与类密切相关但不依赖于它的函数的可查找性。 (2认同)

Ken*_*n T 12

今天突然发现使用@staticmethod.

如果在类中创建了静态方法,则在使用静态方法之前不需要创建类的实例。

例如,

class File1:
    def __init__(self, path):
        out=self.parse(path)

    def parse(self, path):
        ..parsing works..
        return x

class File2:
    def __init__(self, path):
        out=self.parse(path)

    @staticmethod
    def parse(path):
        ..parsing works..
        return x

if __name__=='__main__':
    path='abc.txt'
    File1.parse(path) #TypeError: unbound method parse() ....
    File2.parse(path) #Goal!!!!!!!!!!!!!!!!!!!!
Run Code Online (Sandbox Code Playgroud)

由于方法parse与类File1和有很强的相关性File2,所以把它放在类中更自然。但是,有时这种parse方法在某些情况下也可能用于其他类。如果要使用File1,则必须File1在调用方法之前创建 的实例parse。在类中使用静态File2方法时,您可以直接使用语法调用该方法File2.parse

这使您的工作更加方便和自然。

  • 这对于“@classmethod”也是如此。区别在于“@classmethod”传递类实例,而“@staticmethod”则不传递任何特殊内容。 (3认同)
  • 你不能删除`@staticmethod`并得到相同的结果吗? (2认同)