class="markdown_views prism-atom-one-dark">
前言
类(class)是class="tags" href="/tags/PYTHON.html" title=python>python中很重要的一个概念,也是我们面象对象编程中最重要的概念主之一
如何去理解类,就像如何去理解函数(方法)一样,首先要有一颗常态的心,不要因为新名词,新事物,而自乱阵脚.
然后,尽量用类比的方法去学习一个新事物,会让你更容易理解.
这里简单的说明一下本人对类的理解
从使用角度讲,类是一个有特点的功能集成者.
即当我们说到一个类的时候,
- 通常会去了解这个类能做什么事情.比如,我们Pygame中的矩形(Rect)就是一个类,它可以移动.
- 这个类有什么特点(属性)
从程序设计角度讲,类的组织是为了更好的重用代码,更好的组织代码,以及本质是一个数据类型.
本节提要
内容详情
类的声明:
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token keyword">class class="token class-name">MyClassclass="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token keyword">pass
class: 是一个关键字,就像定义函数时用的def一样,说明我们要定义的是一个类
MyClass: 我们设计的类的类名.就像我们所有的地球人,统称"人"一样,对一个类型的统称
参数object:父类
类的构函数
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token keyword">class class="token class-name">MyClassclass="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token keyword">def class="token function">__init__class="token punctuation">(selfclass="token punctuation">, argsclass="token punctuation">)class="token punctuation">:
class="token keyword">pass
init(self,args)
这个函数称为类的构造函数
用来对类进行一些初始化的操作
这个函数在类进行实例化的时候自动调用
实例:
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token keyword">class class="token class-name">MyClassclass="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token keyword">def class="token function">__init__class="token punctuation">(selfclass="token punctuation">, textclass="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(textclass="token punctuation">)
mc class="token operator">= MyClassclass="token punctuation">(class="token string">"我是在初始化的时候打印的"class="token punctuation">) class="token comment"># 类的实例化
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119201008130.png)
可以看到,当我们实例话的时候,会自动调用__init__()函数
名词:
类中的函数,通常称为类的方法
注意:
构造函数中,函数名是固定的,第一个参数self也是固定的.
如果没有self这个参数,构造函数会出错
看以下实例
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token keyword">class class="token class-name">MyClass2class="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token keyword">def class="token function">__init__class="token punctuation">(textclass="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(textclass="token punctuation">)
mc class="token operator">= MyClass2class="token punctuation">(class="token string">"我是在初始化的时候打印的"class="token punctuation">)
效果图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119201308664.png)
总结:
构造函数:
- 函数名:init()
- 第一个参数self固定的
类的方法
类的实例方法要点:
- 定义在类内部的函数
- 第一个参数必须是self
- 使用时,实例名.方法名()
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token comment"># 类的方法示例
class="token keyword">class class="token class-name">MyClass3class="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token comment"># 构造函数
class="token keyword">def class="token function">__init__class="token punctuation">(selfclass="token punctuation">, textclass="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(class="token string">"我是构造方法" class="token operator">+ textclass="token punctuation">)
class="token comment"># 类的方法:move()
class="token keyword">def class="token function">moveclass="token punctuation">(selfclass="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(class="token string">"我移动了"class="token punctuation">)
mc4 class="token operator">= MyClass3class="token punctuation">(class="token string">"mc4"class="token punctuation">)
mc4class="token punctuation">.moveclass="token punctuation">(class="token punctuation">) class="token comment"># 调用类的move()方法
类的静态方法:
当我们希望一个类,不实例化也能调用类的某个方法时,这个方法应该被定义成静态方法
- 方法定义前加下@staticmethod修饰
- 方法的参数没有self
- 调用时直接用类名.方法名()来使用
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token keyword">class class="token class-name">MyClass5class="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
class="token comment"># 构造函数
class="token keyword">def class="token function">__init__class="token punctuation">(selfclass="token punctuation">, textclass="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(class="token string">"我是构造方法" class="token operator">+ textclass="token punctuation">)
class="token comment"># 类的静态方法,可以实例化直接调用
@class="token builtin">staticmethod
class="token keyword">def class="token function">ddclass="token punctuation">(class="token punctuation">)class="token punctuation">:
class="token keyword">printclass="token punctuation">(class="token string">"所有实例共有方法"class="token punctuation">)
MyClass5class="token punctuation">.ddclass="token punctuation">(class="token punctuation">)
类的属性
第一种:实例属性
要点:
- 定义在构造函数/类的方法内
- 在类的定义中用self.属性名来使用
- 实例化类后用实全例名.属性名来访问或者修改
第二种: 类的属性
要点: - 定义在方法外
- 在类的定义中用类名.属性名来使用
- 类的属性被所有类的实例所共有(改变一次类属性,其他的实例的类属性也会变)
- 可以直接使用类名.属性名来使用
- 当类的属性被实例单独改变时,这个属性会与实例绑定,不再受类.属性名改变而改变
class="prism language-class="tags" href="/tags/PYTHON.html" title=python>python">class="token comment"># 类的属性示例
class="token keyword">class class="token class-name">MyClass6class="token punctuation">(class="token builtin">objectclass="token punctuation">)class="token punctuation">:
weight class="token operator">= class="token number">100 class="token comment"># 类属性
class="token keyword">def class="token function">__init__class="token punctuation">(selfclass="token punctuation">, nameclass="token punctuation">, ageclass="token punctuation">)class="token punctuation">:
selfclass="token punctuation">.name class="token operator">= name class="token comment"># 实例属性name
selfclass="token punctuation">.age class="token operator">= age class="token comment"># 实例属性age
class="token keyword">printclass="token punctuation">(MyClass6class="token punctuation">.weightclass="token punctuation">) class="token comment"># 打印类属性
mc6_1 class="token operator">= MyClass6class="token punctuation">(class="token string">"mc6_1"class="token punctuation">, class="token number">12class="token punctuation">) class="token comment"># 实例化类
class="token keyword">printclass="token punctuation">(mc6_1class="token punctuation">.nameclass="token punctuation">, mc6_1class="token punctuation">.ageclass="token punctuation">) class="token comment"># 访问实例化属性
class="token comment"># 改变类属性与实例化属性
MyClass6class="token punctuation">.weight class="token operator">= class="token number">200 class="token comment"># 我又重了
mc6_1class="token punctuation">.name class="token operator">= class="token string">"mc6_1改名了"
mc6_1class="token punctuation">.age class="token operator">= class="token number">11 class="token comment">#我变年轻了
class="token keyword">printclass="token punctuation">(MyClass6class="token punctuation">.weightclass="token punctuation">)
class="token keyword">printclass="token punctuation">(mc6_1class="token punctuation">.nameclass="token punctuation">, mc6_1class="token punctuation">.ageclass="token punctuation">) class="token comment"># 访问实例化属性
mc6_2 class="token operator">= MyClass6class="token punctuation">(class="token string">"mc6_2"class="token punctuation">, class="token number">20class="token punctuation">)
class="token keyword">printclass="token punctuation">(mc6_2class="token punctuation">.weightclass="token punctuation">)
mc6_2class="token punctuation">.weight class="token operator">= class="token number">300 class="token comment"># 改变了实例的类属性
class="token keyword">printclass="token punctuation">(mc6_1class="token punctuation">.weightclass="token punctuation">)
class="token keyword">printclass="token punctuation">(mc6_2class="token punctuation">.weightclass="token punctuation">)
MyClass6class="token punctuation">.weight class="token operator">= class="token number">400 class="token comment"># 再改类属性
class="token keyword">printclass="token punctuation">(mc6_1class="token punctuation">.weightclass="token punctuation">)
class="token keyword">printclass="token punctuation">(mc6_2class="token punctuation">.weightclass="token punctuation">) class="token comment"># 该实例的此类属性不会再随着类名.属性名 的操作方法改变而改变了
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210119212315141.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTgxMDg0Ng==,size_16,color_FFFFFF,t_70)
后记
类的内容还有很多,这里简单的介绍了类的基本内容:
这几天在折腾电脑,给自己的电脑装了个黑苹果系统.由于无线网卡驱动问题,导致黑苹果系统还无法正式投入使用.明天网卡就能到了,到时候用黑苹果感受一下写代码的感觉是不是比win好点.
今天更新的内容有点少,但是内容的深度比较大,需要慢慢来体会