• 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()

     

  • 相关阅读:
    Go学习(5):集合
    Go学习(4):数组和切片
    Go学习(3):分支循环
    Go学习(2):基本语法
    Go学习(1):简介和配置
    input输入框只能输入数字而且开头不能为零
    JS 显示周 几和 月 日
    IntelliJ Idea 跳出括号并且光标移到末尾的快捷键
    不可小视的String字符串
    PrintWriter中的write与println方法居然就是这些区别
  • 原文地址:https://www.cnblogs.com/luoahong/p/9322329.html
Copyright © 2020-2023  润新知