2019-1-22 13:33:05
python2与python3类继承
- 继承了object的是新式类,不继承 object 的是经典类,在 Python 2 里面新式类和经典类在多继承调用顺序方面会有差异。具体而言就是经典类按照深度优先进行调用,而新式类遵循广度优先进行调用。
#比如下面的代码,深度优先调用就是先从D->B->A->C,而广度优先则是D->B->C->A。
#具体的调用顺序按照mro列表顺序,可以使用mro()函数来查看mro列表。
class A(object):
pass
class B(A):
pass
class C(A):
pass
class D(B,C):
pass
d=D()
print(D.mro())
>>>[<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>]
- 一般而言,使用新式类对多继承的处理更符合逻辑,所以基于这两点提倡大家在创建类时继承object。
- 在Python3的版本中,新建的类默认加载了object(即使你不写object),即拥有object的特性和广度优先的调用特点。但是基于书写规范,建议还是在类的后面添加上object。
importlib反射
- 举例
- 文件目录如下
test/
├── bin
│ └── run.py
├── CC
│ ├── cc.py
│
│
├── conf
│ ├── path1.py
│
│
└── lib
└── cpu
├── cpuinfo.py
- 具体配置
#######run.py###########
import importlib
import sys,os
dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(dir)
from conf import path1
def run():
for i in path1.DIC:
module_path, cls_name = i.rsplit('.', maxsplit=1)
print('module_path--> ',module_path,'/n','cls_name--> ',cls_name)
module = importlib.import_module(module_path)
print('module++++++++> ',module)
obj = getattr(module, cls_name)()
print('obj------> ',obj)
obj.run()
print('----------------------------------------')
run()
#######cc.py###########
class ccc(object):
def run(self):
print('cccccc')
#######path1.py###########
DIC= [
'CC.cc.ccc',
'lib.cpu.cpuinfo.CpuInfo',
]
#######cpuinfo.py###########
class CpuInfo(object):
def run(self):
print('CPU info')
###########################运行run.py结果如下#############################
module_path--> CC.cc
cls_name--> ccc
module++++++++> <module 'CC.cc' from 'Y://Python学习//DjangoWeb-master//test//CC//cc.py'>
obj------> <CC.cc.ccc object at 0x000001562E526908>
cccccc
----------------------------------------
module_path--> lib.cpu.cpuinfo
cls_name--> CpuInfo
module++++++++> <module 'lib.cpu.cpuinfo' from 'Y://Python学习//DjangoWeb-master//test//lib//cpu//cpuinfo.py'>
obj------> <lib.cpu.cpuinfo.CpuInfo object at 0x000001562E526C50>
CPU info
----------------------------------------
###########################分析###########################
在run.py中,引入了importlib模块,他的作用是:
--->将当你只有一个字符串时,如果你想引入这个模块,importlib就允许你可以这么做
--->然后与getattr反射进行配合使用,
--->注意:因为run.py中最后都是执行的run函数,所以在cc.py,cpuinfo.py中需要有run这个函数,这样就能一次性通过字符串方式,调用多个函数