CMDB服务器管理系统【s5day89】:采集资产之整合资产

1、业务逻辑单独写

1、代码目录结构

2、client.py

from src.plugins import PluginManager

class BaseClient(object):

    def post_server_info(self):
        pass

class AgentClient(BaseClient):

    def exec(self):
        obj = PluginManager()
        server_dict = obj.exec_plugin()
        print(server_dict)

class SaltSshClient(BaseClient):

    def get_host_list(self):
        return ['c1.com','c2.com']

    def exec(self):
        host_list = self.get_host_list()
        for host in host_list:
            obj = PluginManager()
			server_dict = obj.exec_plugin()
			print(server_dict)

2、调用方式单独写

引子:

Run是不是要调用client.py这里面的类,每一个模式,每一个类不同,我不希望选择在run里面做
想让主函数非常简洁,尽量把业务业务逻辑调用写在业务插件里

 

1、run.py代码

import sys
import os
BASEDIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASEDIR)
os.environ['AUTO_CLIENT_SETTINGS'] = "conf.settings"
from src import script


if __name__ == '__main__':
    script.start()

2、script.py代码

from lib.config import settings
from .client import AgentClient
from .client import SaltSshClient

def start():
    if settings.MODE == 'AGENT':
        obj = AgentClient()
    elif settings.MODE == "SSH" or settings.MODE == 'SALT':
        obj = SaltSshClient()
    else:
        raise Exception('模式仅支持:AGENT/SSH/SALT')
    obj.exec()

3、接口抽象类概念

约束实现该接口的类中必须定义xxx方法 --------- Python没有其他语言有
interface IFoo:
    def exec(self):pass


class A(IFoo): # 实现IFoo,接口中的方法必须在当前类中实现

    def exec(self):
        pass

class B(IFoo):
    def exec(self):
        pass

def func(arg):
    arg.exec()

obj = A()
func(obj)

4、java实现方法

抽象类: 接口约束的特性;类继承的特性
#抽象类
AbstractClass Foo:

    # 抽象方法,
    def abstractmethod exec():pass

    def bar():
        pass
        pass


class A(Foo): # 当前类继承了抽象类,期中必须定义抽象类中的所有抽象方法

    def exec(self):
        pass

class B(Foo):
    def exec(self):
        pass

def func(arg):
    arg.exec()

5、python实现的两种方法

第一种方法:python里的抽象方法

实例化报错:

from abc import abstractmethod,ABCMeta

class Foo(metaclass=ABCMeta):

    @abstractmethod
    def exec(self):pass

class A(Foo):
    pass

obj = A()

 

截图

只要不实例化就不报错

from abc import abstractmethod,ABCMeta

class Foo(metaclass=ABCMeta):

    @abstractmethod
    def exec(self):pass

class A(Foo):
    pass

#obj = A()

截图

第二种方法:

报错

代码

class Foo(object):
    def exec(self):
        raise NotImplementedError('请实现exec方法')
class A(Foo):
    pass

obj = A()
obj.exec()

截图:

 

不报错

代码如下

class Foo(object):
    def exec(self):
        raise NotImplementedError('请实现exec方法')
class A(Foo):
    pass

obj = A()
#obj.exec()

 

 

posted @ 2018-07-29 12:45  活的潇洒80  阅读(221)  评论(0编辑  收藏  举报