(五)类方法与静态方法
希望从 Python|小林 这样的文本建立一本书,处理步骤包括拆分字段、清理空白和创建实例。可以给类提供另一种创建入口:
# classmethod 接收类对象 cls;staticmethod 不额外补入实例或类。
class Book:
def __init__(self, title, author):
self.title = title
self.author = author
@staticmethod
def clean_title(text):
return text.strip()
@classmethod
def from_line(cls, line):
title, author = line.split("|", maxsplit=1)
return cls(cls.clean_title(title), author.strip())
book = Book.from_line(" Python | 小林 ")
print(book.title, book.author)
print(Book.clean_title(" NumPy "))得到 Python 小林 与 NumPy。本例文本由书名、一个分隔符和作者组成。调用 Book.from_line(...) 时,cls 自动接收 Book 类对象,最后的 cls(...) 再创建实例。静态方法接收写出的实参,不自动接收 self 或 cls。
| 写法 | 自动安排的第一个实参 | 适合本例的工作 |
|---|---|---|
| 普通实例方法 | 当前实例 self |
修改某一本书的状态 |
@classmethod |
调用所关联的类 cls |
从其他形式的数据创建实例 |
@staticmethod |
无 | 清理书名这样的相关小工具 |
self 与 cls 都是惯用名称,绑定方式由方法种类决定。静态方法也可以写成模块函数;放在类中,是把与这类记录有关的工具集中到一个名称下。后面通过子类调用 from_line 时,cls 可以接收子类,沿用同一个创建入口。内置方法装饰器