继承、多态、垃圾回收

在定义类时,可以在类名后的括号内指定当前类的父类(超类、基类、super)

子类(衍生类)可以直接继承父类中所有的属性和方法

在创建类时,如果省略了父类,则默认为父类为object,object是所有类的父类,所有类都继承自object

所有对象都是object的子类

方法的重写

如果在子类中有和父类同名的方法,则通过类实例调用方法时,会调用子类的方法而不是其父类的方法,这个特点我们称为方法的重写(覆盖,override)

 当我们调用一个方法的时候,会优先在当前对象中寻找是否具有该方法,如果有则直接调用,如果没有,则去当前对象的父类中寻找,如果父类中有则直接调用父类中的方法,如果没有,则在父类的父类中寻找,依次类推,直到找到object,如果依然没有,则报错

父类中所有的方法都会被子类继承,包括特殊方法_init_

super()

类中的方法通过实例调用不用使用参数,但是通过类名调用要传递对象(self)

 

super()可以用来获取当前的类的父类,通过super()调用方法时,不需要传递self,super().__init__(name) 相当于上图中框出的语句

多重继承

类名.__bases__这个属性来获取当前类的所有父类,返回的结果是一个元组,一个类中可以有多个父类,这个特性叫做多重继承

  • 可以在类名的括号后面添加多个类实现多重继承

  • 多重继承会使子类同时拥有多个父类

  • 在开发中没有特殊情况,应该尽量避免使用多重继承,因为多重继承会让我们的代码过于复杂

如果多个父类中,有同名的方法,则会在第一个父类中寻找,然后再找第二个,再找第三个,前边覆盖后边,谁在前边的用谁的

前面父类的方法会覆盖后面父类的方法

多态

一个对象可以以不同的形态去呈现

对于say_hello()函数来说,只要对象中含有name属性,它就可以作为参数传递,这个函数不会考虑对象的类型,只要有name属性就行

下面这种情况,违反了多态原则,导致程序适用性差 

 

鸭子类型:

如果一个东西,走路像鸭子,叫声像鸭子,那么它就是鸭子

多态比如len()函数,可以获取到列表对象的长度,也可以获取字符串对象的长度,这个就是典型的多态;之所以一个对象能通过len()来获取长度,是因为对象中具有一个特殊方法__len__,就可以使用len()来获取它的长度

面向对象的三大特征

  • 封装:确保了对象中的数据安全

  • 继承:保证了对象的扩展性

  • 多态:多态保证了程序的灵活性

 

垃圾回收

程序在运行的过程中也会产生垃圾,程序运行过程中产生的垃圾会影响程序运行的性能,所以这些垃圾必须及时清理

没用的东西就是垃圾

在程序中没有被引用的对象就是垃圾

所谓的垃圾回收就是把在内存中没有引用的对象删除

在Python中有垃圾回收机制,它会自动将这些没有被引用的对象删除掉,所以不用手动删除

__del__是一个特殊方法,它会在对象被回收的前调用

 

del函数删除的是变量不是对象,上述这个魔术方法会删除没有使用的对象

程序结束的时候对象也会被自动删除

特殊方法

特殊方法也称为魔术方法,都是使用__开头结尾,一般不需要我们手动调用,需要只在一些特殊情况下自动执行

__str__就是将对象可以转换成str输出

__repr__指对象在交互模式下直接输出结果

object.lt(self, other) < object.le(self, other) <= object.eq(self, other) == object.ne(self, other) != object.gt(self, other) > object.ge(self, other) >=

...

关于特殊方法大家可以在下面这个文档中仔细阅读

3. Data model — Python 3.7.12 documentation

模块

模块简介

模块化就是将一个完整的程序分解成一个一个小的模块,通过将模块组合,来搭建一个完整的程序

  • 不采用模块化,就是将所有的代码编写到一个文件中

  • 采用模块化,将程序分别编写到多个文件当中

模块化的优点:

  1. 方便开发

  2. 方便维护

  3. 模块可以复用

模块的创建

在Python中一个py文件就是一个模块,要想创建模块实际上就是创建py文件

注意:模块名要符合标识符的规范

 

在一个模块中引入外部模块

  1. import 模块名(模块名就是py文件的名字,注意不要py)

  2. 可以引入同一个模块多次,但是模块的实例只会创建一个(在一个文件中引入多次,但是该模块的实例只有一个)

  3. 引入 模块的的第二种方式

    import 模块名 as 模块别名

  4. 所有的import都写到文件的开头

  5. 每一个模块对的内部都有一个__name__属性,这个属性返回模块的名字

 

 

_name_属性值为_main_的模块是主模块,一个程序只有一个主模块,主模块就是直接通过Python执行的模块

 

直接执行哪个文件哪个就是主模块,主模块只有一个

包(package)

from 包名 import 模块名

包也是一个模块,普通模块就是一个py文件,而包是一个文件

当我们模块中的代码过多时,或者一个模块需要分解为多个模块时,这时就需要使用到包

包中必须有一个__init__.py文件,这个文件中可以包含包中的主要内容

 

__pycache__是模块需要缓存的文件,Python代码在执行前,需要将解析器转换成机器码,然后再执行,所有我们在使用包时,也需要将模块中的代码先转换为机器码然后再交给计算机执行,而为了提高程序运行的性能,Python会在编译一次后,将代码保存到一个缓存文件中,这样在下次加载包或者模块的时候,就可以不再重新编译,直接加载缓存中编译好的代码

为了实现“开箱即用”的思想,Python为我们提供了一个模块的标准库,在这个标准库中,有很多很强大的模块我们可以直接使用,并且标准库会随Python的安装一同安装

Python Module Index — Python 3.7.12 documentation

sys模块,它里面提供了一些变量和函数,使我们获取到了Python解析器的信息或者通过函数来操作Python解析器

sys.argv获取当前命令行所包含的所有参数,返回列表,列表中保存所有参数

sys.modules获取当前程序中引入的所有的模块

pprint模块提供了一个方法,pprint()方法,对要打印的数据进行简单的格式化

 

sys.path 这是一个列表,列表中保存的是模块的搜索路径

sys.platform 表示当前Python运行的平台

sys.exit()函数用来退出程序

os模块可以让我们对操作系统进行访问

os.environ 通过这个属性可以获取系统的环境变量

os.system() 用来执行操作系统的名字,在终端执行命令,命令就是括号里接受的字符串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值