. 多继承
1. 为什么使用多继承? 为了隔离多个维度的变化
2. 同名方法解析顺序? 继承列表从左向右(广度优先)
class A:
def func01(self):
print("A -- func01")
class B(A):
def func01(self):
print("B -- func01")
# 创建D对象,执行C
# 创建B对象,执行A
super().func01()
class C(A):
def func01(self):
print("C -- func01")
super().func01()
class D(B, C):
def func01(self):
print("D -- func01")
super().func01()
d = D() # D --> B --> C --> A
d.func01()
# 通过类型的mro方法,查看同名方法解析顺序
print(D.mro())
. 模块:
导入方式1:语法:import 模块名
使用:模块名. 成员
本质:创建变量名,关联该模块地址
import module01
module01.func01()
导入方式2:语法:from 模块 import 内容
使用:直接使用内容
本质:将该模块成员导入到当前作用域
def func01():
print("demo02 - func01")
from module01 import func01
func01()
func01()
from module01 import *
func02()
. 包:
根目录
包(文件夹+init.py)
模块(文件)
类
函数
语句
# 路径:从根目录开始写(不写根目录)
# 方式一:我过去
import package01.package02.module02 as m2
m2.func01()
# 方式二:你过来
from package01.package02.module02 import func01
func01()
只导入包,不导入包的模块,必须配置__init__.py
# 方式1
import package01.package02 as p2
p2.module02.func01()
# 方式2
# from package01 import package02
#
# package02.module02.func01()
from package01.package02 import *
module02.func01()
if __name__ == "__main__":
print("老子(demo04)是主模块!!!!")
. 总结:
-
为什么要有模块和包?将代码有逻辑的组织在一起,使得结构更加清晰
-
(主流)导入方式
方式1:我过去
import 模块名
模块名. 成员
import 路径. 模块名 as 别名
别名. 成员
方式2:你过来 from 模块 import 成员 直接使用成员 from 路径.模块 import 成员 直接使用成员 from xxx import * 直接使用所有成员 路径:从项目根目录开始(不包含根目录) 3. (非主流)导入方式:导入包,不导入模块 必须配置包的__init__.py模块 import 包 from 包 import 包 4.搜索模块顺序:按照系统路径搜索,如果有满足条件,立即停止. import sys print( sys.path) 系统路径是一个列表 第一个元素是根目录(主模块(第一次运行的模块)所在的文件夹) 导入模块是否成功的唯一标准: 导入路径 + 系统路径 = 真实路径
模块变量
# 1. 变量__doc__存储的是:模块的文档注释
# print(__doc__)
# print(random.__doc__)
# 2. 变量__name__存储的是:当前模块名称
import demo04
# 如果当前是主模块
if __name__ == "__main__":
print("老子(demo05)是主模块!!!!")