你好,我是kelly,今天分享Python类方法的作用。
在类的定义中,使用关键词@classmethod装饰的方法,称为类方法。类方法的第一个参数默认是cls,cls代表类本身。在语法层面,类方法的功能有2个:
1)能访问类属性、方法
2)可以被类和类实例调用
在实践中,业务层面作用也有2个,一是让类具有记忆能力;二是作为工厂方法,个性化实例化类。
一、让类具有记忆能力
如何使用:通过定义类属性,结合类方法,让类具有记忆能力(实例之间的数据共享)。
类属性一般定义在类的顶部,与之相对应的实例属性一般定义在__init__构造函数中。
class Book(object):
num = 0 # 类属性,在不同实例之间共享
def __init__(self, title):
self.title = title # 实例属性
def __new__(cls, *args, **kwargs):
cls.num += 1
return super().__new__(cls)
@classmethod
def get_total_num(cls):
return cls.num
类Book定义了一个类属性num,可以被不同的类实例所共享,即不管创建多少类实例,内存中始终只存在一个。
In [85]: book1 = Book("西游记")
...: book2 = Book("水浒传")
...: book3 = Book("三国演义")
In [86]: Book.get_total_num()
Out[86]: 3
这里通过类方法,得到了类实例的数目,这样就实现了类记忆能力。
二、个性化实例化类
能根据不同输入,对类进行不同的实例化。避免显式直接调用类的构造函数,增加程序的灵活性。
class OtherBook(object):
num = 0
def __init__(self, title):
self.title = title
def __new__(cls, *args, **kwargs):
cls.num += 1
return super().__new__(cls)
@classmethod
def get_total_num(cls):
return cls.num
@classmethod
def create_book(cls, title):
return cls(title=title)
在OtherBook类中,定义了类方法create_book,有cls和title两个参数。在类方法create_book内部,根据不同title进行实例化。
In [88]: book1 = OtherBook.create_book("西游记")
...: book2 = OtherBook.create_book("水浒传")
...: book3 = OtherBook.create_book("三国演义")
...: OtherBook.get_total_num()
Out[88]: 3
在实例化时,不显式对OtherBook实例化,而是通过类方法隐式实例化,对外隐藏了实例化的细节。
本文原始版本发表链接:
kelly会在公众号「kelly学技术」不定期更新文章,感兴趣的朋友可以关注一下,期待与您交流。
--over--