跳到主要内容

Python staticmethod() 函数

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

示例

class Calculator:

def add_numbers(num1, num2):
return num1 + num2

# 将 add_numbers() 转换为静态方法
Calculator.add_numbers = staticmethod(Calculator.add_numbers)

sum = Calculator.add_numbers(5, 7)
print('和:', sum)

# 输出:和: 12

staticmethod() 语法

staticmethod() 的语法是:

注意staticmethod() 被认为是一种不符合 Python 风格的创建静态函数的方式。因此,在 Python 的新版本中,您可以使用 @staticmethod 装饰器。

@staticmethod 的语法是:

def func(args, ...)

staticmethod() 参数

staticmethod() 方法接受单个参数:

  • function - 需要转换为静态方法的函数

staticmethod() 返回类型

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

什么是静态方法?

静态方法,就像 类方法 一样,是绑定到类而不是其对象的方法。

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

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

  • 静态方法不了解类,只处理参数。
  • 类方法与类一起工作,因为它的参数始终是类本身。

它们可以被类和其对象调用。

Class.staticmethodFunc()
或者
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("相等")
else:
print("不相等")

输出

相等

这里,我们有一个 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("相等")
else:
print("不相等")

输出

相等

在这里,我们不希望子类DatesWithSlashes覆盖静态实用方法toDashDate,因为它只有一个用途,即将日期更改为破折号日期。

我们可以通过在子类中覆盖getDate()方法以使其与DatesWithSlashes类协同工作,从而轻松地利用静态方法。