Python staticmethod()

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 类很好地协同工作。


另请阅读

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战