第7.4节 Python中与众不同的类
一、 引言
在较旧的Python版本中,类型和类之间泾渭分明:内置对象是基于类型的,而自定义对象是基于类的。因此,你可以创建类,但不能创建类型。在较新的Python 2版本中,这种差别不那么明显。在Python 3中,已不再区分类和类型了,类就是类型,类型就是类,如int型就是class(int)。
首先声明,除非特殊说明本章所有关于类的知识都是基于Python3.73的版本来的,有些内容在低版本特别是Python3.0以下的Python中不支持。
二、 语法
1. 创建自定义类的语法
class 类名:
执行语句...
零个到多个类变量...
零个到多个方法...
3、 语法说明:Python 的类定义由类头(指 class 关键字、类名和冒号)和统一缩进的类体构成,在类体中最主要的两个成员就是类变量和方法。如果不为类定义任何类变量和方法,那么这个类就相当于一个空类,如果空类不需要其他可执行语句,则可使用 pass 语句作为占位符。
1) class关键字:class为类定义的声明关键字,类定义创建独立的命名空间,用于在其中定义函数和变量,这些函数和变量就是类和实例的方法和属性;
2) 类名:必须是一个合法的Python标识符(只能由字母、数字和下划线(_)构成,且不能以数字打头,且下划线开头的名称有特殊含义,一般不使用)。Python推荐的命名规范,要求类名遵循驼峰命名法,即类名必须是由一个或多个有意义的单词连缀而成的,每个单词首字母大写,其他字母全部小写,单词与单词之间不要使用任何分隔符;
3) 类体:类体与函数体类似,在类头后接统一缩进的类体,可以有单独的类代码,可以有变量和函数,不过类中的函数称为方法;
4) 类定义说明文档:与函数文档字符串类似,Python 也允许为类定义文档字符串,文档字符串放在类声明之后、类体之前,如上面程序中第二行的字符串所示。
从上面定义来看,Python 的类定义有点像函数定义,都是以冒号(:)作为类体的开始,以统一缩进的部分作为类体的。区别只是函数定义使用 def 关键字,而类定义则使用 class 关键字。
三、 类的主要特征
1. Python 类所包含的最重要的两个成员就是变量和方法,类中各成员之间的定义顺序没有任何影响,各成员之间可以相互调用;
2. 类中定义的方法包括方法则用于定义该类或实例对象的行为或功能实现,类中的方法包括类方法、静态方法和实例方法。在后面章节单独介绍;
3. 类所包含的变量又分为类变量和实例变量,类体中定义的变量为类变量,实例变量是实例方法中定义的self对象的变量,对于每个实例都是独有数据,而类变量是该类所有实例共享的属性和方法:
1) 类变量属于类本身,用于定义该类本身所包含的状态数据;
2) 实例变量则属于该类的对象,用于定义对象所包含的状态数据。
关于类变量和实例变量,在后面章节单独介绍。
4. 在class语句中定义的代码都是在一个特殊的命名空间(类的命名空间)内执行的,而类的所有成员都可访问这个命名空间。类定义其实就是要执行的代码段,类体中的代码(未在方法中的代码)在类定义时执行,当定义实例变量时类体中的代码不会再执行,这个与函数体中的代码完全不同;
5. 类还可以支持在类体中定义类,不过这种模式使用场景基本没有,在此不展开说明;
6. Python中类的构造方法是:__init__,构造方法用于构造该类的对象,Python 通过调用构造方法返回该类的对象。构造方法在定义实例对象时执行,也就是当类被实例化的时候就会执行该函数,__init__()方法是可选的,如果不提供,Python 会给出默认的__init__方法;
7. Python中类的析构方法是:__del__,当使用del 删除对象时,会调用他本身的析构函数,另外当对象在某个作用域中调用完毕,在跳出其作用域的同时析构函数也会被调用一次,这样可以用来释放内存空间。__del__()也是可选的,如果不提供,则Python 会在后台提供默认析构函数如果要显式的调用析构函数,可以使用del关键字,方式如下:del对象名
8. Python类所包含的类变量和实例变量都可以动态增加或删除:
1) 程序也可在任何地方通过赋值语句为已有的类和实例增加变量;程序可通过 del 语句删除己有类的类变量和实例变量;
2) 程序中可以动态调整类定义,后定义的类定义将覆盖原有的类定义;
3) 程序调整类的类变量、实例变量和类定义后,已有的类的实例不受影响,如在类中删除一个实例变量a、类变量c、删除方法f后,原有的实例中还能看到a、c、f,同样新增的类变量、实例变量、类方法、实例方法,原有的实例不能使用。
9. 类中所有方法的全局空间和类本身的全局空间是同一个,但二者的局部名字空间不同。类中所有方法中的局部名字空间与全局名字空间和类本身的局部名字空和全局名字空的关系与函数和函数调用环境中局部名字空间和全局名字空间的关系一样。
四、 类定义举例
以上节介绍的鸭子类进行扩展来举例说明类的定义方法:
class Duck():
print("现在执行Duck类类体代码,开始定义类构造函数")
def __init__(self):
self.sex='公鸭'
self.age=1
print("构造函数执行完毕!")
print("现在定义walk方法")
def walk(self):
print('I walk like a duck')
print("现在定义swim方法")
def swim(self):
print('I swim like a duck')
print("现在定义quack方法")
def quack(self):
print('I quack like a duck')
print("现在定义类析构函数")
def __del__(self):
print("Duck对象析构函数执行")
可以看到,类定义时,类体中没在方法外的代码全部执行,定义实例对象时,会执行构造函数,实例回收时执行析构函数,但不能直接通过”类名.方法”方式执行实例方法。
本节介绍的相关知识都是基于Python3的,实际上在Python3之前有旧式类和新式类的说法,且在Python 3之前默认创建的是旧式类,在较旧的Python版本中,要创建新式类,应在脚本或模块开头放置赋值语句__metaclass__ = type。当然,还有其他解决方案,如从新式类(如object)派生出子类。Python 3,就无需考虑这一点,因为根本没有旧式类了。因此关于这部分内容就不展开说了。
Python的类之所以说与众不同,因为它的构造方法、析构方法、类方法和实例方法、封装模式、类体代码,还有后面要提到或介绍的__new__方法、静态方法、装饰器、动态定义属性和方法等等,都与很多语言有很大的不同,因此说与众不同。
本节介绍了Python中类的语法、构成及各部分的特征,有关内容涉及面较广,如果大家不好理解,建议自己多找点资料看看。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。
欢迎大家批评指正,谢谢大家关注!
第7.4节 Python中与众不同的类的更多相关文章
- 第7.8节 Python中隐秘的类封装方法
前面章节已经介绍了Python中的多态和继承,本节将介绍面向对象程序设计OOP三大特征的另一个特征--封装. 一. 概念 封装是将对象的状态信息(也就是数据.属性)隐藏在对象内部,将对象的属性和 ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
- 第7.15节 Python中classmethod定义的类方法详解
第7.15节 Python中classmethod定义的类方法详解 类中的方法,除了实例方法外,还有两种方法,分别是类方法和静态方法.本节介绍类方法的定义和使用. 一. 类方法的定义 在类中定 ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- 第7.22节 Python中使用super调用父类的方法
第7.22节 Python中使用super调用父类的方法 前面章节很多地方都引入了super方法,这个方法就是访问超类这个类对象的.由于super方法的特殊性,本节单独谈一谈super方法. 一.su ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- 第11.20节 Python 中正则表达式的扩展功能:后视断言、后视取反
一. 引言 在<第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反>中老猿介绍了前视断言和前视取反,与二者对应的还有后视断言和后视取反. 二. (?<=-)后视 ...
- 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容
一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...
随机推荐
- 美团面试官问我: ZGC 的 Z 是什么意思
本文的阅读有一定的门槛,请先了解 GC 的基本只知识. 现代垃圾收集器的演进大部分都是往减少停顿方向发展. 像 CMS 就是分离出一些阶段使得应用线程可以和垃圾回收线程并发,当然还有利用回收线程的并行 ...
- 四:servlet最终形态
之前那么麻烦的创建servlet,其实创建是非常简单的 1.在src项目下右键new一个servlet即可 2. 这样生成的servlet会自动在web.xml生成一个映射的资源名字就和java类的名 ...
- 重构rbd镜像的元数据
这个已经很久之前已经实践成功了,现在正好有时间就来写一写,目前并没有在其他地方有类似的分享,虽然我们自己的业务并没有涉及到云计算的场景,之前还是对rbd镜像这一块做了一些基本的了解,因为一直比较关注故 ...
- python-验证码图片识别
import tesserocr from PIL import Image #新建Image对象 image = Image.open('code.png') #调用tesserocr的image_ ...
- Camtasia对录制视频字幕编辑的教程
我们小时候会有这样的疑问,电视剧上的字幕是怎么做成的呢.字幕又是怎么不会从一幕到下一幕而产生不对应的呢.这就是影视的后期处理的结果了,利用视频的编辑软件,工作者们可以在特定的时间内加上相对应的台词,然 ...
- Vegas让人物回眸更有韵味的方法分享
"回眸一笑百媚生,六宫粉黛无颜色",是白居易在<长恨歌>中描述杨贵妃美貌的名句,这一句运用夸张的手法,反映了杨贵妃回眸时的娇媚横生,百般娇媚. 接下来,小编就教你用视频 ...
- keras中seq2seq实现
这里只是简单的一个例子 输入序列 目标序列 [13, 28, 18, 7, 9, 5] [18, 28, 13] [29, 44, 38, 15, 26, 22] [38, 44, 29] [27, ...
- 基于gin的golang web开发:docker
Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...
- 蓝桥杯——测试次数·摔手机(2018JavaB组第4题,17分)
x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机. 各大厂商也就纷纷推出各种耐摔型手机.x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通. x ...
- HEXO & CARDS主题进阶配置
我想对于建立一个网站而言,第一步要能够做到正常在线访问以及定期产出一定的内容, 其实当网站建立好那一刻,这第一步已经算是完成了,不过我在此基础之上做了些扩展 在默认的card主题之上,我设置了标签.分 ...