私有化、继承、多态
知识点
私有化
xx:公有变量
_x:单前置下划线,用于定义私有化属性或方法,当在其它模块通过from xxx import *时是无法导入的,但是可以通过子类和类对象进行访问,也可以通过导入具体的变量名进行访问
1
2
3
4
5
6
7# 导入具体的变量名
from Demo1 import _a
# 在子类中也可直接访问
class Test2(Test1):
def func(self):
print(self._a)__xx:双前置下划线,用于定义私有化属性或方法,成员之间无法进行访问,同时子类也无法访问。但是可以通过【对象名._类名__私有对象名】进行访问
__xx__:双前后下划线,python内置的魔法对象或属性。自已不要发明这类名字
xx_:单后置下划线,为了避免自己定义的变量名与系统的关键字冲突
import导入
模块导入顺序
1 | # 检查模块的导入顺序 |
常见导入方式
1 | from xx import yy |
import注意点
1 | # 假如在一个新的文件中定义全局变量和一个方法 |
- 通过【from xx import 属性名】可以理解为在当前页面重新定义了一个全局变量,此时在别的方法中调用该全局变量则需要globe声明以下才可以调用
- 通过【import xx】导入,则可以通过xx.属性名来访问,其实就相当于访问xx对象的属性值
- 通过【from xx import 方法名/类名】可以理解为在当前页面重新定义了一个方法和类
其它
import有个重复导入的验证机制,即之前已经导入的模块在重新导入时并不会发生任何变化
如果需要重新导入某个模块,则可以通过reload方法
1
2
3# 该方法仅适用于import xx的导入格式,且reload的类必须已经导入过
from imp import reload
reload(xx)
封装、多态、继承的优点
封装
- 在面向过程编程时,当需要对数据进行处理时,需要考虑到用哪个模板中的哪个函数进行操作。但是当面向对象编程时,因为已经将数据存储到这个独立的空间中,这个独立的空间(即对象)中通过一个特殊的变量(__class__)能够获取到类(模板),而且这个类中的方法是由一定数量的,与此类无关的是不会出现在本类中,因此需要对数据进行处理时,可以很快的定位到需要的方法是谁,这样更方便
- 全局变量只能有一份,当很多个函数在使用全局变量时需要备份,往往需要利用其它的变量来进行储存;而通过封装会将用来储存数据的这个变量变为对象中的一个属性,只要对象不一样,那么这个属性就可以再创建一份,互不干扰
- 面向对象时,通过任务的不同划分出不同的对象,构建出不同的方法、属性,从程序的结构上看代码更加清晰
继承
- 能够提升代码的重用率,即开发了一个类,可以在多个子功能中直接使用
- 继承能够有效的进行代码的管理,当某个类有问题,只要修改这个类就行,而继承这个类的子类往往不需要进行修改
多态
提高了代码的可拓展性,用于区别不同类的不同点
作业
- (问答)python定义的变量名中,_xx格式的变量名的作用,及其使用中的一些注意点
- (问答)python定义的变量名中,__xx格式的变量名的作用,及其使用中的一些注意点
- (问答)python定义的变量名中,__xx__格式的变量名的作用,及其使用中的一些注意点
- (问答)python定义的变量名中,xx_格式的变量名的作用,及其适用中的一些注意点
- (问答)python中导入模块的6种常见方式
- (问答)通过【from xx import 属性名】导入其它模块的属性,此时在本模块如何使用该属性
- (问答)为什么通过【import xx】导入后,可以通过【xx.属性名】直接访问,而不需要全局申明
- (问答)通过【import xx】导入一个模块后,再次通过【import xx】重新导入一遍,是否会对第一个导入的内容产生影响?为什么?如果希望能够重新再次导入xx模块,有什么办法
- (问答)请简述python程序开发过程中常说的封装、继承、多态的优点
- 打印出import导入时,模块所有的查找路径
- 将当前路径下的name文件夹添加到系统查找模块的路径中去
- 将当前路径下的name文件夹添加到系统查找模块的路径中去,并且设置其搜索优先级为第一位