Python第41天 importlib与反射

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这个函数,这样就能一次性通过字符串方式,调用多个函数

给TA打赏
共{{data.count}}人
人已打赏
开发

Python第51天 bootstrap模板使用2

2023-9-11 18:33:24

开发

Python第50天 Bootstrap模板使用1

2023-9-11 18:33:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索