第7.15节 Python中classmethod定义的类方法详解
类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法。本节介绍类方法的定义和使用。
一、 类方法的定义
在类中定义的方法,默认是实例方法,要定义类方法,需要用到单独的语法。
1. 语法:
@classmethod
def 方法名(cls,其他参数):
方法体
2. 定义说明:
1) 上述语法定义中,@classmethod称为类方法装饰器,凡是类方法定义都必须有该装饰器。
装饰器是Python中一个重要概念,本质上是一个对函数进行转换的函数,以@符号开头,后面是一个函数名。关于装饰器涉及比较多的知识,在本节暂不展开介绍,后面章节专门介绍,大家只要知道定义类方法需要使用@classmethod就行了。
2) 参数中的cls代表类自身,与实例方法中的self是相同的机制,也可以是任意的名字,类方法定义时第一个形参必须是cls,所有关于类属性的访问在类方法内都必须通过cls或类名进行方法。
二、 类方法的使用
类方法用在与单个实例无关但与类或类的所有实例相关的访问场景,具体使用的方式如下:
1. 类方法可以在所有类方法中通过“类名.方法名”方式调用;
2. 类方法可以在类方法中通过“cls.方法名”方式调用,cls的来源请见上面类方法定义的说明;
3. 类方法可以在实例方法中通过“类名.方法名”方式调用;
4. 类方法可以在实例方法中通过“self.方法名”或“self.__class__.方法名”方式调用;
1) 这种方式当类名可能修改时比直接用类名调用方便;
2) 该访问方式可以用在构造方法等实例方法中,但“self.__class__.方法名”不能用在重写的__new__方法中。
a) 关于__ new__方法,相关内容在此不仔细介绍,大家可以到网上查一下资料,后面老猿将考虑单独介绍,需要说明的是这也是一个实例定义时执行的方法,它在构造方法之前执行,一般不要重写该方法;
b) “self.__class__.方法名”不能用在重写的__new__方法中是因为此时实例还没创建完成,不能正确的获取到self.__class__的值(此时self.__class__的值为<class 'type'>),而类方法与实例无关,因此“self.方法名”可以访问。
5. 类方法可以在类定义外的调用方代码中通过“类名.方法名”方式调用;
6. 类方法可以在类定义外的调用方代码中通过“实例名.方法名”方式调用,此时实参也无需传递cls;
7. 类方法可以在类定义外的调用方代码中通过“实例名. __class__.方法名”方式调用,这种方式有点画蛇添足,只是在此说明一种访问方法,并不推荐使用。
注意类方法不能在类体代码中调用:
1. 不能在类体中直接调用类方法时,这个时候类还未定义完,执行时会认为类未定义,会报类对象不可调用;
2. 当实例方法和类方法重名时,在类体代码中后出现的方法会覆盖前面的方法,其实在Python中,同一名字空间的同名函数(不管参数是否数目相同)都会被后定义的覆盖,Python不支持一个函数不同变量的情况。由于类方法和实例方法都在类的空间内,因此二者不能重名。
本节详细介绍了类方法的定义和使用方法,注意类方法定义必须使用装饰器,方法中第一个形参为cls,通过“类名.方法名”的调用处不用传递实参cls,而是由Python代填。类方法的具体案例请见下节的案例介绍。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!