第7.15节 Python中classmethod定义的类方法详解

第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的世界。
欢迎大家批评指正,谢谢大家关注!

  • 15
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值