第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的世界。

欢迎大家批评指正,谢谢大家关注!

第7.15节 Python中classmethod定义的类方法详解的更多相关文章

  1. 第7.16节 案例详解:Python中classmethod定义的类方法

    第7.16节  案例详解:Python中classmethod定义的类方法 上节介绍了类方法定义的语法以及各种使用的场景,本节结合上节的知识具体举例说明相关内容. 一.    案例说明 本节定义的一个 ...

  2. python中的subprocess.Popen()使用详解---以及注意的问题(死锁)

    从python2.4版本开始,可以用subprocess这个模块来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值. subprocess意在替代其他几个老的模块或者函数 ...

  3. python中argparse模块用法实例详解

    python中argparse模块用法实例详解 这篇文章主要介绍了python中argparse模块用法,以实例形式较为详细的分析了argparse模块解析命令行参数的使用技巧,需要的朋友可以参考下 ...

  4. python中requests库使用方法详解

    目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...

  5. Python中的变量和作用域详解

    Python中的变量和作用域详解 python中的作用域分4种情况: L:local,局部作用域,即函数中定义的变量: E:enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部 ...

  6. **Python中的深拷贝和浅拷贝详解

    Python中的深拷贝和浅拷贝详解   这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容.   要说清楚Python中的深浅拷贝,需要 ...

  7. Python中random模块生成随机数详解

    Python中random模块生成随机数详解 本文给大家汇总了一下在Python中random模块中最常用的生成随机数的方法,有需要的小伙伴可以参考下 Python中的random模块用于生成随机数. ...

  8. Python中%r和%s的详解及区别_python_脚本之家

    Python中%r和%s的详解及区别_python_脚本之家 https://www.jb51.net/article/108589.htm

  9. 第9.2节 Python的文件打开函数open详解

    一. 引言 在操作一个文件前,大部分情况需要先打开文件,才能进行,在Python中使用内置函数open来打开一个文件.open函数是Python的一个内置函数,io模块 定义的函数open是该内置函数 ...

随机推荐

  1. 关于||和&&运算符及表达式的执行

    ++a || ++b && ++c表达式中++a,--b,++c三者执行与否的判断 在||运算符前的表达式为真,则其后的表达式不执行 eg:执行前 a=2,  b=2,  c=2 执行 ...

  2. 13 SOAP

    13 SOAP SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service) ...

  3. 利用MultipartFile来进行文件上传

    这个例子实在SpringMVC的基础上完成的,因此在web.xml中需要配置 web.xml <!-- 配置Spring MVC的入口 DispatcherServlet,把所有的请求都提交到该 ...

  4. 解决 Vmware 服务拒绝访问的问题

    背景 在服务页面想将 VMware NAT Service 设置为自动开启的,但是保存的时候显示拒绝访问,如下图 解决方案 想到在本机的火绒启动项管理里面将 VMware NAT Service 设置 ...

  5. 搭建vue-cli4.0项目

      ① Vue CLI的包名称由 vue-cli 改成了 @vue/cli. 如果已经全局安装了旧版本的 vue-cli(1.x或2.x), 你需要先通过 npm uninstall vue-cli ...

  6. 聊一聊sockmap 以及ebpf 实例演示

    eBPF实质上是一个内核注入技术 用户态可以用C来写运行的代码,再通过一个Clang&LLVM的编译器将C代码编译成BPF目标码: 用户态通过系统调用bpf()将BPF目标码注入到内核当中,并 ...

  7. 创建Grafana监控视图

    前言 Grafana允许查询,可视化,警报和了解指标,无论它们存储在哪里. 可视化:具有多种选项的快速灵活的客户端图.面板插件提供了许多不同的方式来可视化指标和日志. 动态仪表盘:使用模板变量创建动态 ...

  8. Linux_end

    1.ps 查看进程 ps 查看进程 ps aux 查看所有进程 ps -ef 查看所有进程的详细信息 2.pstree 查看进程树 3.top 查看系统的健康状况 4.netstar 显示网络统计信息 ...

  9. 记一次ceph的故障修复(20160408)

    ceph的在正常运行的时候基本不会出现故障,出现故障一般在变动的时候,具体有下面几种可能出现的情形 软件升级 增加存储节点 减少存储节点 调整副本数目 调整pg数目 磁盘出现损坏 节点网络出现异常 以 ...

  10. go get以后下载的包不在src下而在pkg的问题

    我的GOPATH是这样的 但是当我go get下载包之后 下载的却不在src,而是在 $GOPATH$/pkg 下 原因可能是之前第一次go get下载, GitHub的速度太慢了,我更改了代理,使用 ...