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