staticmethod()
内置函数返回给定函数的静态方法。
示例
class Calculator:
def add_numbers(num1, num2):
return num1 + num2
# convert add_numbers() to static method
Calculator.add_numbers = staticmethod(Calculator.add_numbers)
sum = Calculator.add_numbers(5, 7)
print('Sum:', sum)
# Output: Sum: 12
staticmethod() 语法
staticmethod()
的语法是
staticmethod(function)
注意:staticmethod()
被认为是非 Pythonic 的创建静态函数的方式。因此,在较新版本的 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
# 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
,因为它只有一个用途,即将日期更改为破折号日期。
我们可以通过在子类中覆盖 getDate()
方法来充分利用静态方法,使其与 DatesWithSlashes
类很好地协同工作。
另请阅读