首页 » Python » python3 高级篇 » 正文

CMDB_唯一标识+面向对象版本区别+importlib 反射代码

唯一标识问题

当我们使用salt-stack远程控制我们的机器时候,都是通过一个唯一的标识去链接,那么这个唯一标识如何定义呢?

如果我们远程的机器是虚拟机,唯一的标识不是咱们server的sn号 也不是IP,那是什么呢?

id 这个在salt-stack已经帮我们规定好了,不允许有任何重复的id,这样不管是虚拟机还是物理机都有一个唯一标识的id了。

面向对象python2-3的区别

python2:

不写 object 就是 经典类 ,写 object 就是 新式类

class Foo()     --> 经典类
class Foo(object)       -->  新式类

python3:

写不写object 都是 新式类

class Foo()     --> 新式类
class Foo(object)       -->  新式类

例如:

经典类:

class D():
    def run(self):
        print('this D')
    
class C():
    def run(self):
        print('this C')
    
class B(D):
    pass

class A(B,C):
    pass
    
demo=A()
demo.run()

如果使用python2版本去执行: 经典类(深度优先)
this D

新式类:

class D(object):
    def run(self):
        print('this D')
    
class C(D):
    def run(self):
        print('this C')
    
class B(D):
    pass

class A(B,C):
    pass
    
demo=A()
demo.run()

如果使用python2版本去执行: 新式类(非广度优先)
this C

importlib 反射代码

三个方法:getattr,hasattr,setattr。

直接来看代码:

路径为:func/hosts/disk.py

class Disk(object):
    def run(self):
        print("disk running...")

调用disk.py

import importlib
#from func.hosts import disk
Host_func_dic = {
    'disk':'func.hosts.disk.Disk',
#    'disk':'func.hosts.cpu.Cpu',
#    'disk':'func.hosts.mem.Mem',
}
path = Host_func_dic.get('disk')        ##path == 'func.hosts.disk.Disk'

module_path,class_name = path.rsplit('.',maxsplit=1)        ##resplit右边开始分割,只分割1次,
print('module_path-->',module_path)     #func.hosts.disk
print('class_name-->',class_name)       ##Disk

#下面相当于from func.hosts import disk
module = importlib.import_module(module_path)
#import_module反射,getattr(disk,'Disk'),disk 代表disk.py,Disk代表类
disk_class = getattr(module,class_name)
#实例化Disk
JG=disk_class()
JG.run()    ##执行run方法

执行结果:

module_path--> func.hosts.disk
class_name--> Disk
disk running...
赞 (0)

发表评论