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