说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 staticmethod() 是一个装饰器,它可以将一个方法封装为一个静态方法,该方法不强制要求传递参数。
以下是简单的使用示例:
class Calculator:
@staticmethod
def add_numbers(num1, num2):
return num1 + num2
c = Calculator()
c.add_numbers(1, 2)
# 3
Calculator.add_numbers(2, 3)
# 5
'''
这里 staticmethod 方法无论在类,还是在实例中,都可以使用。定义时,不需要传入实例对象或者类对象。
语法为:
staticmethod(function) -> method
# or
@staticmethod
def func(cls, args...):
pass
staticmethod 将方法转换为静态方法。静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法:
class C:
@staticmethod
def f(cls, arg1, arg2, ...):
...
@staticmethod 这样的形式称为函数的 decorator -- 详情参阅 函数定义。
静态方法既可以由类中调用(如 C.f()),也可以由实例中调用(如C().f()
)。此外,还可以作为普通的函数进行调用(如 f()
)。
Python 的静态方法与 Java 或 C++ 类似。另请参阅 classmethod() ,可用于创建另一种类构造函数。
像所有装饰器一样,也可以像常规函数一样调用 staticmethod ,并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法:
def regular_function():
...
class C:
method = staticmethod(regular_function)
版本更新情况:
在 3.10 版更改: 静态方法继承了方法的多个属性(__module__
、__name__
、__qualname__
、__doc__
和 __annotations__
),还拥有一个新的 __wrapped__
属性,并且现在还可以作为普通函数进行调用。
静态方法与类方法非常相似,是绑定到类而不是对象的方法,它们不需要创建类实例。因此,它们不依赖于对象的状态。
静态方法和类方法的区别在于:
Class.staticmethodFunc()
# or
Class().staticmethodFunc()
静态方法的能力有限,因为与类方法或类中的任何其他方法一样,它们无法访问类本身的属性。
然而,当您需要一个实用函数,它不访问类的任何属性,但有意义地认为它属于该类时,我们使用静态函数。
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。它是一个静态方法,因为它不需要访问日期本身的任何属性,只需要参数。
我们也可以在类外创建 toDashDate,但因为它只适用于 Dates,所以将其保留在 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 类配合使用。
更新时间:2022-05-16 23:08:21 标签:python class 类 方法 静态方法