
staticmethod()内置函数为给定函数返回静态方法。
staticmethod()的语法为:
staticmethod(function)
使用staticmethod()被认为是创建静态函数的非Python标准方式。
因此,在较新版本的Python中,您可以使用@staticmethod装饰器。
@staticmethod的语法为:
@staticmethod def func(args, ...)
staticmethod()参数
staticmethod()方法采用单个参数:
- function -需要转换为静态方法的函数 
staticmethod()返回值
staticmethod()对于作为参数传递的函数,返回静态方法。
什么是静态方法?
静态方法与类方法非常相似,是绑定到类而不是对象的方法。
他们不需要创建类实例。因此,它们不依赖于对象的状态。
静态方法和类方法之间的区别是:
- 静态方法对类一无所知,只处理参数。 
- 类方法与类一起使用,因为其参数始终是类本身。 
可以通过类及其对象来调用它们。
Class.staticmethodFunc() or even Class().staticmethodFunc()
示例1:使用staticmethod()创建一个静态方法
class Mathematics:
    def addNumbers(x, y):
        return x + y
# 创建addNumbers静态方法
Mathematics.addNumbers = staticmethod(Mathematics.addNumbers)
print('总数是:', Mathematics.addNumbers(5, 10))输出结果
总数是: 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仅适用于带破折号(-)的日期的类。但是,在我们以前的数据库中,所有日期都以斜杠表示。
为了将斜线日期转换为带破折号(-)日期,我们创建了一个效用函数toDashDate中Dates。
这是静态方法,因为它不需要访问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-date。
通过重写getDate()子类中的方法,我们可以轻松地利用静态方法来发挥自己的优势,从而使其与DatesWithSlashes类一起正常工作。
