📅  最后修改于: 2020-09-20 04:34:26             🧑  作者: Mango
staticmethod()
的语法为:
staticmethod(function)
使用staticmethod()
被认为是创建静态函数的非Python方式。
因此,在较新版本的Python,可以使用@staticmethod
装饰器。
@staticmethod
的语法为:
@staticmethod
def func(args, ...)
staticmethod()
方法采用一个参数:
staticmethod()
为作为参数传递的函数返回静态方法。
静态方法与类方法非常相似,是绑定到类而不是对象的方法。
他们不需要创建类实例。因此,它们不依赖于对象的状态。
静态方法和类方法之间的区别是:
可以通过类及其对象来调用它们。
Class.staticmethodFunc()
or even
Class().staticmethodFunc()
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
静态方法的用例有限,因为与类方法或类中的任何其他方法一样,静态方法无法访问类本身的属性。
但是,当您需要一个不访问类的任何属性但知道它属于该类的实用程序函数时,我们将使用静态函数。
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
类中是合乎逻辑的。
当我们不希望类的子类更改/覆盖方法的特定实现时,可以使用静态方法。
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
类一起很好地工作。