zoukankan      html  css  js  c++  java
  • 第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的世界。
    欢迎大家批评指正,谢谢大家关注!

  • 相关阅读:
    20201029模拟赛总结
    20201023模拟赛总结
    贪心题目选讲
    博客阅览帮助
    NTT&FFT(快速?变换,以及扩展)
    数论知识小结 [基础篇]
    数论知识小结 [微提高篇]
    零化多项式/特征多项式/最小多项式/常系数线性齐次递推
    牛顿迭代快速求解定义域为多项式的函数零点
    求导/泰勒展开
  • 原文地址:https://www.cnblogs.com/LaoYuanPython/p/11087699.html
Copyright © 2011-2022 走看看