Python面向对象汇总
Python面向对象知识点内容汇总
1. 如何在Python中创建类
1 |
|
2. 类与对象
- 类相当于一个代码模板,可以使用这个模板生产出多个”产品”,这个”产品”在Python中为实例对象,一句话总结:一个类可以创建多个实例对象。
- 对象是类创建出来的,可以理解为一个具体事物的存在,通过这个对象我们可以使用在类中创建出来的属性与方法。
1 |
|
3. 实例属性与实例方法
实例方法与普通的函数类似,不同点是实例方法是在类中定义的,并且方法中的第一个形式参数为
self
1 |
|
实例属性与之前学习的变量类似,可以存储数据。但是实例属性只能被实例对象调用。定义实例属性的方式有多种,一般使用
__init__
方法创建实例属性。
1 |
|
1 |
|
1 |
|
总结:
- 使用类创建的对象是
实例对象
,类创建对象的过程为类的实例化
- 如果一个类中的方法的第一个参数为
self
,那么这个方法就是实例方法
- 所谓的
实例属性
其实就是一个变量,用来存储数据。实例属性
只能被实例对象
访问。
4. 类中的self
在讲解self
这个参数之前,我们必须要知道类实例化执行的大致过程!!!
- 在内存中开辟一个空间。
- 将类产出的实例对象存储在这个独立的空间中。
注意:类的代码与实例对象不在一个内存空间中,实例对象所占用的空间只是存储了实例属性等一些数据而已。
当我们了解到在实例化的过程中产出的实例对象保存在一个单独的内存空间之后,那么这个self
其实就是指向了这个单独的实例对象的内存空间。
通过这一个特性,我们就可以使用self
这个参数去访问类中的属性与方法了。一句话总结:类中的self
指的是这个类的实例对象本身。
1 |
|
如果一个类创建了多个实例对象,那么self
根据接收的实例对象的不同获取的属性也不同。
1 |
|
5. __init__
方法
所谓的
__init__
方法其实就是一种比较特殊的实例方法,也被称之为构造方法。这个方法特殊的地方在于在类实例化的过程中会自动执行该方法,无需开发者手动执行,一般用作创建实例属性。对于
__init__
方法我们必须知道的是:构造方法不是我们创建出来的,这个方法在object
基类中已经实现(object
类是所有类的父类,也被称之为基类,在Python3中的类都默认继承了这个基类,至于什么是继承,在下面的内容中会进行讲解。)在创建
__init__
方法时需要注意的是:第一个参数必须为self
,构造方法没有返回值,也就是说构造方法不能写return
1 |
|
6. 私有属性
私有属性不能在类的外部调用,只能在一个类的内部使用。这种特殊属性可以提供一定的数据安全性。
1 |
|
7. 私有方法
私有方法与私有属性类似,只能在一个类的内部使用。
1 |
|
8. 对象关联
使用对象关联可以让两个独立存在的类相互访问。
1 |
|
利用对象关联的特性实现将多个学生关联到一个教室
1 |
|
9. 继承
在大多数语言中都有继承的概念,所谓的继承其实就是将已经存在的类中的属性与方法传递给一个新的类,这种行为类似于我们人类社会中的遗产继承。
1 |
|
在类的继承过程中有两个专业术语:父类、子类
- 父类:被继承的类
- 子类:继承的类
在一些其它资料中会将父类称之为基类
,子类称之为派生类
。所表达的含义都是一样的。
10. 单继承
所谓的单继承其实就是字面意思,子类继承了一个父类。
1 |
|
在子类中创建父类没有的属性并使用父类中的方法打印这些属性。
1 |
|
在使用继承时我们需要注意的是:如果需要添加新的属性与方法需要在子类中实现,不要在父类中实现新属性与新方法。原因是:只要在父类修改了代码,那么会影响所有继承这个父类的子类。
如果父类中含有私有属性与私有方法的情况下,在继承时子类不会获取父类的私有属性与私有方法。
11. 多继承
多继承就是一个子类继承了多个父类,类似日常生活中的 “干爹”。
1 |
|
多继承的实际应用
1 |
|
12. 重写
如果一个子类中继承了一个父类,但是父类中的方法不能满足与当前的业务需求,那么我们就可以在子类中创建一个与父类同名的方法进行方法覆盖,这样的代码行为我们称之为重写。
1 |
|
在之后的日常开发中如果发现一个父类中的一些方法不能满足当前业务需求,则直接在子类中创建与父类同名的方法,并实现自己需要的业务逻辑即可。需要注意的是:方法修改限于子类,不能修改父类方法。修改父类方法会影响其它的子类。
13. super
方法
如果在子类使用父类中的方法,但是父类中的方法有一部分代码不满足业务需求。那么可以使用
spuer()
方法重用满足需求的部分代码。
1 |
|
1 |
|
1 |
|
注意点:
- 使用
spuer()
方法可以调用父类中的方法,但是不能使用super()
方法获取或修改父类中的实例属性。如果需要请使用父类的类对象或者父类的实例对象进行获取或修改。 super()
方法可以获取父类中的类属性,但是不能修改和删除。
14. 多态
多态从字面意思上分析的话就是多种形态的意思。如果多个子类(单个子类也可以)继承了同一个父类,并且同时对同一个父类中的方法进行了重写,那么这种代码行为我们称之为多态。
1 |
|
总结:实现多态必须满足以下条件:
- 有继承关系
- 有方法重写
15. 静态方法
如果类中的方法的第一个参数为
self
,则调用这个方法必须通过实例对象。这种方法也被称之为实例方法。但是现在我期望在不创建实例对象的情况下也能调用类中的方法的话,那么我们就需要创建静态方法
进行方法调用。
1 |
|
总结:如果类中的某一个方法无需使用类中的属性与方法的情况下,则可以使用静态方法。
16. 类属性
如果使用构造方法创建出来的属性我们称之为实例属性。但是实例属性与实例对象是绑定关系,每个实例对象都有自己的实例属性,并且多个实例对象中的实例属性是相互隔离的。在某些场景中多个对象需要共用一个属性的情况下,就需要使用类属性进行数据共享。
1 |
|
17. 类方法
类方法的主要功能是对类中的类属性进行操作,相对于静态方法来说,类方法可以访问类属性,静态方法不能访问。
1 |
|
总结:
- 定义类方法时需要使用
@staticmethod
修饰。 - 类方法的第一个形式参数为
cls
。cls
指向的是类对象,也就是类本身。 - 类方法可以使用
实例对象
与类名
调用。
18. 类对象
一个类创建的实例属性是保存在实例对象中的,那么在类中创建的类对象保存在哪里呢?答案是类对象中。类对象保存了当前这个类的方法与类属性。实例对象通过一个特殊的方法
__class__
来访问类对象中所保存的方法与属性。
1 |
|
dir()
方法:如果想要查看一个实例对象中的所有属性与方法,可以使用dir()
方法查看。
1 |
|
19. 多继承以及MRO继承顺序
在多继承中使用
类名.__init__()
的方式进行父类方法调用
1 |
|
运行结果:
1 |
|
在多继承中使用
super()
进行父类方法调用
1 |
|
运行结果:
1 |
|
上述两种调用父类的方法是有区别的
- 如果2个子类中都继承了父类,当在子类中通过父类名调用时,
parent
被执行了2次 - 如果2个子类中都继承了父类,当在子类中通过
super
调用时,parent
被执行了1次
在单继承中使用
super()
1 |
|
运行结果:
1 |
|
总结:
super().__init__
相对于类名.__init__
,在单继承上用法基本没有区别- 但在多继承上有区别,
super
方法能保证每个父类的方法只会执行一次,而使用类名的方法会导致方法被执行多次,具体看前面的输出结果 - 多继承时,使用
super
方法,对父类的传参,由于super
的算法导致的原因,必须把参数全部传递,否则会报错 - 单继承时,使用
super
方法,则不能全部传递,只能传父类方法所需的参数,否则会报错 - 多继承时,相对于使用
类名.__init__
方法,要把每个父类全部写一遍, 而使用super
方法,只需写一句话便执行了全部父类的方法,这也是为何多继承需要全部传参的一个原因
20. 单例模式
如果对一个类进行了多次的实例化,那么在内存中产生多个实例对象。在某些场景下,并不需要多个实例对象。而是重用第一次创建的实例对象。例如:在一个类中创建了多个关于云服务器的连接信息,这些信息是不变的。那么只是需要一个实例对象来访问这些信息,而不是创建多个来占用内存。
1 |
|
1 |
|
总结:
__new__
方法是一个特殊的方法,与__init__
方法类似。如果在类中存在以双下划线开头并且双下划线结尾的方法名时,则这个方法我们称之为魔术方法。魔术方法在基类object
中已经实现。- 在类的实例化过程中,
__new__
方法比__init__
方法先执行。 __new__
方法的第一个参数为cls
,而不是self
。在object
基类源码中可以发现__new__
方法是一个类方法。
21. object
基类
在Python3中,所有定义的类都默认继承了
object
。在object
类中实现了多个方法,包括了魔术方法。
1 |
|