私有化、继承、多态

知识点

私有化

  • 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
2
3
4
5
6
7
8
9
10
# 检查模块的导入顺序
import sys

print(sys.path) # sys模块中有一个path方法会打印出导入模块时的顺序

# 通过sys.path.append(路径)可以向系统中的模块查找路径添加自定义的
sys.path.append("./name/") # 通过该方法导入的查询路径位于列表的最后

# 为了提高自定义路径的查询优先级,可以用sys.path.insert()方法提高优先级
sys.path.insert(0, "路径")

常见导入方式

1
2
3
4
5
from xx import yy
from xx import yy,zz
import xx as yy
import xx
import xx,yy

import注意点

1
2
3
4
# 假如在一个新的文件中定义全局变量和一个方法
def name():
pass
age = 16
  • 通过【from xx import 属性名】可以理解为在当前页面重新定义了一个全局变量,此时在别的方法中调用该全局变量则需要globe声明以下才可以调用
  • 通过【import xx】导入,则可以通过xx.属性名来访问,其实就相当于访问xx对象的属性值
  • 通过【from xx import 方法名/类名】可以理解为在当前页面重新定义了一个方法和类

其它

  1. import有个重复导入的验证机制,即之前已经导入的模块在重新导入时并不会发生任何变化

  2. 如果需要重新导入某个模块,则可以通过reload方法

    1
    2
    3
    # 该方法仅适用于import xx的导入格式,且reload的类必须已经导入过
    from imp import reload
    reload(xx)

封装、多态、继承的优点

  • 封装

    1. 在面向过程编程时,当需要对数据进行处理时,需要考虑到用哪个模板中的哪个函数进行操作。但是当面向对象编程时,因为已经将数据存储到这个独立的空间中,这个独立的空间(即对象)中通过一个特殊的变量(__class__)能够获取到类(模板),而且这个类中的方法是由一定数量的,与此类无关的是不会出现在本类中,因此需要对数据进行处理时,可以很快的定位到需要的方法是谁,这样更方便
    2. 全局变量只能有一份,当很多个函数在使用全局变量时需要备份,往往需要利用其它的变量来进行储存;而通过封装会将用来储存数据的这个变量变为对象中的一个属性,只要对象不一样,那么这个属性就可以再创建一份,互不干扰
    3. 面向对象时,通过任务的不同划分出不同的对象,构建出不同的方法、属性,从程序的结构上看代码更加清晰
  • 继承

    1. 能够提升代码的重用率,即开发了一个类,可以在多个子功能中直接使用
    2. 继承能够有效的进行代码的管理,当某个类有问题,只要修改这个类就行,而继承这个类的子类往往不需要进行修改
  • 多态

    提高了代码的可拓展性,用于区别不同类的不同点

作业

  1. (问答)python定义的变量名中,_xx格式的变量名的作用,及其使用中的一些注意点
  2. (问答)python定义的变量名中,__xx格式的变量名的作用,及其使用中的一些注意点
  3. (问答)python定义的变量名中,__xx__格式的变量名的作用,及其使用中的一些注意点
  4. (问答)python定义的变量名中,xx_格式的变量名的作用,及其适用中的一些注意点
  5. (问答)python中导入模块的6种常见方式
  6. (问答)通过【from xx import 属性名】导入其它模块的属性,此时在本模块如何使用该属性
  7. (问答)为什么通过【import xx】导入后,可以通过【xx.属性名】直接访问,而不需要全局申明
  8. (问答)通过【import xx】导入一个模块后,再次通过【import xx】重新导入一遍,是否会对第一个导入的内容产生影响?为什么?如果希望能够重新再次导入xx模块,有什么办法
  9. (问答)请简述python程序开发过程中常说的封装、继承、多态的优点
  10. 打印出import导入时,模块所有的查找路径
  11. 将当前路径下的name文件夹添加到系统查找模块的路径中去
  12. 将当前路径下的name文件夹添加到系统查找模块的路径中去,并且设置其搜索优先级为第一位