📜  Python staticmethod()

📅  最后修改于: 2020-09-20 04:34:26             🧑  作者: Mango

staticmethod()内置函数为给定函数返回静态方法。

staticmethod()的语法为:

staticmethod(function)

使用staticmethod()被认为是创建静态函数的非Python方式。

因此,在较新版本的Python,可以使用@staticmethod装饰器。

@staticmethod的语法为:

@staticmethod
def func(args, ...)

staticmethod()参数

staticmethod()方法采用一个参数:

  1. 函数 -需要转换为静态方法的函数

从staticmethod()返回值

staticmethod()为作为参数传递的函数返回静态方法。

什么是静态方法?

静态方法与类方法非常相似,是绑定到类而不是对象的方法。

他们不需要创建类实例。因此,它们不依赖于对象的状态。

静态方法和类方法之间的区别是:

  1. 静态方法对类一无所知,只处理参数。
  2. 类方法与类一起使用,因为其参数始终是类本身。

可以通过类及其对象来调用它们。

Class.staticmethodFunc()
or even
Class().staticmethodFunc()

示例1:使用staticmethod()创建一个静态方法

class Mathematics:

    def addNumbers(x, y):
        return x + y

# create addNumbers static method
Mathematics.addNumbers = staticmethod(Mathematics.addNumbers)

print('The sum is:', Mathematics.addNumbers(5, 10))

输出

The sum is: 15

什么时候使用静态方法?

1.将实用程序函数分组到一个类

静态方法的用例有限,因为与类方法或类中的任何其他方法一样,静态方法无法访问类本身的属性。

但是,当您需要一个不访问类的任何属性但知道它属于该类的实用程序函数时,我们将使用静态函数。

示例2:将实用程序函数创建为静态方法

class Dates:
    def __init__(self, date):
        self.date = date
        
    def getDate(self):
        return self.date

    @staticmethod
    def toDashDate(date):
        return date.replace("/", "-")

date = Dates("15-12-2016")
dateFromDB = "15/12/2016"
dateWithDash = Dates.toDashDate(dateFromDB)

if(date.getDate() == dateWithDash):
    print("Equal")
else:
    print("Unequal")

输出

Equal

在这里,我们有一个Dates类,仅适用于带有破折号的日期。但是,在我们以前的数据库中,所有日期都以斜杠表示。

为了将斜杠日期转换为破折号,我们在Dates创建了一个实用函数 toDashDate

这是一种静态方法,因为它不需要访问Dates本身的任何属性,而只需要参数。

我们也可以在类外部创建toDashDate ,但是由于它仅适用于日期,因此将其保留在Dates类中是合乎逻辑的。

2.单一实施

当我们不希望类的子类更改/覆盖方法的特定实现时,可以使用静态方法。

示例3:继承如何与静态方法一起使用?

class Dates:
    def __init__(self, date):
        self.date = date
        
    def getDate(self):
        return self.date

    @staticmethod
    def toDashDate(date):
        return date.replace("/", "-")

class DatesWithSlashes(Dates):
    def getDate(self):
        return Dates.toDashDate(self.date)

date = Dates("15-12-2016")
dateFromDB = DatesWithSlashes("15/12/2016")

if(date.getDate() == dateFromDB.getDate()):
    print("Equal")
else:
    print("Unequal")

输出

Equal

在此,我们不希望子类DatesWithSlashes覆盖静态实用程序方法toDashDate因为它只有一次使用,即将date更改为dash-dates。

通过覆盖子类中的getDate()方法,我们可以轻松地利用静态方法,从而使它与DatesWithSlashes类一起很好地工作。