记住一句话:类是模板,而实例则是根据类创建的对象。

我初学时对类的理解是从类的字面上,可以片面的认为它是一个种类,它是相似特征的抽像,也就是相似的东西,可以把相似特征的事务抽象成一个类。(事务可以是具体的物体或行为)

以圆为例,圆是具有圆周率(pi)和半径(r)两个相似特征的属性。根据相似特征抽象出圆类,每个圆的半径可以不同,那么半径可以作为圆的实例属性;而每个圆的圆周率pi是相同的,那么圆周率pi就可以作为类属性,这样就定义出了一个圆类。而我们要知道圆的面积,周长等可以通过类方法计算出来。

(看完整篇文章,还是对类不理解,回过头在来看这部分,对照列子多理解。)

一、Python类的定义与实例的创建

在Python中,类通过 class 关键字定义,类名通用习惯为首字母大写,Python3中类基本都会继承于object类,语法格式如下,我们创建一个Circle圆类:

class 

注意:我们定义的类都会继承于object类,当然也可以不继承object类;两者区别不大,但没有继承于object类使用多继承时可能会出现问题。

有了Circle类的定义,就可以创建出具体的circle1、circle2等实例,circle1和circle2是个实际的圆。创建实例使用 类名+(),类似函数调用的形式创建。

如下我们创建两个Circle类的实例:

circle1

二、Python类中的实例属性与类属性

类的属性是用来表明这个类是什么的。

类的属性分为实例属性类属性两种。

实例属性用于区分不同的实例;类属性是每个实例的共有属性。

区别:实例属性每个实例都各自拥有,相互独立;而类属性有且只有一份,是共有的属性。

1、实例属性

类的属性都是用来指明这个类"是什么",实例属性是用来区分每个实例不同的基础。

在上面我们创建了Circle类,大家都知道所有圆都具备半径这个通用属性,下面我们为circle1、circle2 圆实例添加半径 r 这个属性并赋值。

circle1

如上 circle1.r、circle2.R 大小写有区分,两个实例的属性名称不统一不利于后面的访问和使用,而且每次在创建圆后我们要再为实例添加属性会比较麻烦,所以我们可以在创建实例时给类初始属性。

在定义 Circle 类时,可以为 Circle 类添加一个特殊的 __init__() 方法,当创建实例时,__init__() 方法被自动调用为创建的实例增加实例属性。

我们在此为每个实例都统一加上我们需要的属性(用法类似java的构造方法):

class 

注意:__init__() 方法的第一个参数必须是 self(self代表类的实例,可以用别的名字,但建议使用约定成俗的self),后续参数则可以自由指定,和定义函数没有任何区别。

拓展:__init__() 方法的用法类似java中的构造方法,但它不是构造方法,Python中创建实例的方法是__new__() ,这个方法在python大多数使用默认方法,不需要重新定义,初学者不用关注__new()__方法。

相应,创建实例时就必须要提供除 self 以外的参数:

circle1 

注意:实例名.属性名 circle1.r 访问属性,是我们上面Circle类__init__() 方法中 self.r 的 r 这个实例属性名,而不是__init__(self, r)方法中的 r 参数名,如下更加容易理解:

class 

面试喜欢问的问题:创建类时,类方法中的self是什么?
self 代表类的实例,是通过类创建的实例 (注意,在定义类时这个实例我们还没有创建,它表示的我们使用类时创建的那个实例)

2、类属性

绑定在实例上的属性不会影响其他实例,但类本身也是一个对象,如果在类上绑定属性,则所有实例都可以访问该类的属性,并且所有实例访问的类属性都是同一个!!!记住,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

圆周率π为圆的共有属性,我们可以在Circle类添加pi这个类属性,如下:

class 

输出结果:

----

仔细观察我们通过类创建的实例修改的类属性后,通过其他实例访问类属性他的值还是没有改变。其实是通过实例修改类属性是给实例创建了一个与类属性同名的实例属性而已,实例属性访问优先级比类属性高,所以我们访问时优先访问实例属性,它将屏蔽掉对类属性的访问。

我们删除circle1实例的实例属性pi,就能访问该类的类属性了。

print

输出结果:

----删除circle1实例属性pi-----
pi=  3.14159
circle1.pi=  3.14159
circle2.pi=  3.14159

可见,千万不要在实例上修改类属性,它实际上并没有修改类属性,而是给实例绑定了一个实例属性。

三、Python类的实例方法

方法是表明这个类用是来做什么。

在类的内部,使用 def 关键字来定义方法,与一般函数定义不同,类方法必须第一个参数为 self, self 代表的是类的实例(即你还未创建类的实例),其他参数和普通函数是完全一样。

如下我们给圆类 Circle 添加求面积的方法 get_area :

class 

注意:示例中的 get_area(self) 就是一个方法,它的第一个参数是 self 。__init__(self, name)其实也可看做是一个特殊的实例方法。

在方法的内部需要调用实例属性采用 "self.属性名 " 调用。示例中 get_area(self) 对于 pi 属性的引用 Circle.pi 与 self.pi 存在一定区别。

Circle.pi 使用的是类属性 pi,我们通过创建的实例去修改 pi 的值对它无影响。self.pi 为实例的 pi 值,我们通过创建的实例去修改 pi 的值时,由于使用 self.pi 调用的是实例属性,所以 self.pi 是修改后的值。

调用实例的方法中使用实例属性可采用 实例名.方法名(除self的参数) 使用。

四、总结

参数的传递图,翻译与pythoncentral网

  • In 1 and 2, the arguments are passed to the method.
  • 1和2参数传递给__init__方法中的data参数
  • On 3, the self argument refers to the instance.
  • 3 self 参数指向当前实例自身,self代表创建的实例变量 ik1 或者 Kls('arun')。
  • At 4, we do not need to provide the instance to the method, as it is handled by the interpretor itself.
  • 4 我们不需要传递实例自身给方法,Python解释器自己会做这些操作的;ik14 会自动作为第一个实例参数(self)传入方法中。
Python 类的思维导图

Python 类入门

木头人:Python入门 面向对象编程理论基础

木头人:Python入门 类class 基础篇

木头人:Python入门 类class提高篇

木头人:Python入门 class类的继承

2018-2-28 第一次修改,增加对类的说明,促进对类的理解

2018-3-28 第二次修改,修改语法错误

2019-9-17 第三次修改,增加__init__() 方法的拓展说明,增加思维导图

class括号里的object_Python入门 类class 基础篇相关推荐

  1. 02 MSC类设备-基础篇(二)

    上一篇: https://blog.csdn.net/qq_40088639/article/details/110489923 四.Bulk-Only Transport协议传输模型 分析BusHo ...

  2. Jmeter 入门 从0-1 基础篇-实操

    Jmeter 入门 从0-1 基础篇 笔记有的图片链接可能失效了,等我修改好了在来编辑哈 文章目录 1 JMeter 1.1 JMeter环境搭建和基本使用 1.1.1 JMeter环境搭建 1.1. ...

  3. Linux开发从入门到精通——基础篇 :1、计算机常识、Linux操作系统和文件系统介绍

    Linux开发从入门到精通--基础篇 :1.计算机常识.Linux操作系统和文件系统介绍

  4. 01 MSC类设备-基础篇(一)

    一.简介 在USB协议中,规定了一类大容量存储设备(Mass Storage Device Class)协议.常见的USB大容量设备有:U盘.USB移动硬盘.USB移动光驱.USB读卡器.USB打印机 ...

  5. JAVA从入门到精通------基础篇------线程

    1.什么是进程 程序是静止的,只有真正运行时的程序才能被称为进程 举个例子,我们的每一个软件就是一个进程 单核CPU在任何时间点上,只能运行一个进程,宏观并行,微观串行 2.什么是线程 线程,又称轻量 ...

  6. C++零基础入门教程:基础篇(一)

    前言 嘿嘿,我叕来啦─=≡Σ(((つ•̀ω•́)つ!别问我为什么突然变成了零基础入门教程(一),因为前面那三篇都是基础的不能在基础的教程了.(其实是因为顺序乱了,而且那时候没有单独弄一个专栏,后面我会 ...

  7. Python Qt GUI设计:QPushButton、QRadioButton和QCheckBox按钮类(基础篇—12)

    目录 1.QPushButton按钮类 2.QRadioButton按钮类 3.QCheckBox按钮类 在GUI设计中,按钮都是最重要的和常用的触发动作请求的方式,用来与用户进行交互操作.在PyQt ...

  8. Python Qt GUI设计:QMainWindow、QWidget和QDialog窗口类(基础篇—10)

    目录 1. QMainWindow窗口 2.QWidget窗口 3.QDialog窗口 3.1.QMessageBox窗口 3.2.QInputDialog窗口 3.3.QFontDialog窗口 3 ...

  9. C++入门第一阶段——基础篇

    C++入门 如何创建C++程序 C++相关基础 变量 变量的意义 变量创建的语法 代码示例 常量 常量的意义 常量的定义方式 关键字 关键字的含义 sizeof 标志符的命名 什么是标志符 命名规则 ...

最新文章

  1. QIIME 2教程. 04人体微生物组分析Moving Pictures(2020.11)
  2. 单调队列板子:求滑动窗口中最大值和最小值
  3. 输出某个目录下的所有文件和文件夹,包括子文件夹中的内容
  4. 错误处理和调试2 - C++快速入门31
  5. GNUstep 运行gui程序
  6. 索爱小蜜蜂扩音器怎么样啊~
  7. java迷宫算法_迷宫求解算法(java版)
  8. Down Payment一个不错的练习
  9. UCT树用于四子棋对抗实验
  10. 开年第一炸:黑马程序员1月就业报告新鲜出炉!
  11. 图片去除水印两种工具及多种思路
  12. 【Python】5行代码采集3000+上市公司信息
  13. GROMACS知识问答
  14. Camera tuning岗位面试总结
  15. 2020年程序员客栈云端收入排行榜
  16. 安装 Chrome 插件:Stylish、xStyle​、Tampermonkey、SwitchyOmega
  17. 公司×××访问建立之三核心交换机Huawei Quidway S6502的设置
  18. ILOG CPLEX求解TSP问题
  19. 使用CSS把Div放在屏幕中间。
  20. 高精地图生产中的坐标系

热门文章

  1. 元旦去哪玩?用Python告诉你哪些景点爆满!
  2. pika主从同步原理
  3. Linux系统中运行.sh文件的几种方法
  4. Scrapy框架的日志信息与配置信息
  5. 信道划分介质访问控制
  6. 大作文十大必背范文:五星级真题
  7. 《Python程序设计》题库(2)
  8. 如何让黑白图片恢复“生机”
  9. 通俗易懂理解~图机器学习导论
  10. 三分钟教你快速选择机器视觉传感器