说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
Python 的内置函数 classmethod() 是一个装饰器,它可以将一个方法封装为一个类的方法。修饰符对应的函数不需要实例化,不需要 self 参数,但第一个参数需要是表示自身类的 cls 参数,可以来调用类的属性,类的方法,实例化对象等。
以下是简单的使用示例:
from datetime import date
# random Person
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def fromBirthYear(cls, name, birthYear):
return cls(name, date.today().year - birthYear)
def display(self):
print(self.name + "'s age is: " + str(self.age))
person = Person('Adam', 19)
person.display()
person1 = Person.fromBirthYear('John', 1985)
person1.display()
'''
Adam's age is: 19
John's age is: 31
'''
在这里,我们有两个类实例创建者,一个构造函数和一个 fromBirthYear 方法。
构造函数采用常规参数 name 和 age。而 fromBirthYear 获取 class, name 和 birthYear,通过将当前年龄与当前年份相减来计算当前年龄,并返回类实例。
语法为:
classmethod(function) -> method
# or
@classmethod
def func(cls, args...):
pass
将函数转换为类方法。类方法接收类(一般作 cls)作为隐式第一个参数,就像实例方法接收实例(self)一样。
要声明类方法,请使用以下习惯用法:
class C:
@classmethod
def f(cls, arg1, arg2, ...):
...
它可以在类(例如 C.f()
)或实例(例如 C().f()
)。实例被忽略,但其类除外。
如果为派生类调用类方法,则派生类对象将作为隐含的第一个参数传递。
类方法不同于 C++ 或 Java 静态方法。如果您想要静态方法,可以使用内置的 @staticmethod
。
版本更新情况:
在 3.9 版更改: 类方法现在可以包装其他 描述器 例如 property()。
在 3.10 版更改: 类方法现在继承了方法的属性(__module__
、__name__
、__qualname__
、__doc__
和 __annotations__
),并拥有一个新的 __wrapped__
属性。
无论何时通过将工厂方法实现为类方法来派生类,它都可以确保正确创建派生类的实例。
您可以为上面的示例创建一个静态方法,但它创建的对象将始终被硬编码为基类。
但是,当您使用类方法时,它会创建派生类的正确实例。
from datetime import date
# random Person
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
@staticmethod
def fromFathersAge(name, fatherAge, fatherPersonAgeDiff):
return Person(name, date.today().year - fatherAge + fatherPersonAgeDiff)
@classmethod
def fromBirthYear(cls, name, birthYear):
return cls(name, date.today().year - birthYear)
def display(self):
print(self.name + "'s age is: " + str(self.age))
class Man(Person):
sex = 'Male'
man = Man.fromBirthYear('John', 1985)
print(isinstance(man, Man))
man1 = Man.fromFathersAge('John', 1965, 20)
print(isinstance(man1, Man))
'''
True
False
'''
在这里,使用静态方法创建类实例需要我们在创建过程中硬编码实例类型。这显然会给人与人之间的继承带来问题。
fromFathersAge 方法不返回 Man 对象,而是返回其基类 Person 的对象。
这违反了 OOP 范式。将类方法用作 fromBirthYear 可以确保代码的 OOP 性,因为它将第一个参数作为类本身并调用其工厂方法。
pandas 中的 pd.DataFrame.from_dict()
,源码为:
@classmethod
def from_dict(
cls,
data,
...
) -> DataFrame:
"""
Construct DataFrame from dict of array-like or dicts.
Creates DataFrame object from dictionary by columns or by index
allowing dtype specification.
"""
...
return cls(realdata, index=index, columns=columns, dtype=dtype)
pd.DataFrame()
是一个类对象,通过 @classmethod
让类有了一个类方法。
更新时间:2022-05-16 22:44:54 标签:python class 类 方法 类方法