200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > python 抽象类 抽象方法 接口 依赖注入 SOLIP

python 抽象类 抽象方法 接口 依赖注入 SOLIP

时间:2023-11-19 00:59:59

相关推荐

python 抽象类 抽象方法 接口 依赖注入 SOLIP

python 抽象类、抽象方法、接口、依赖注入、SOLIP

1、程序设计原则:SOLIP

SOLIP设计原则

1、单一责任原则(SRP)

一个对象对只应该为一个元素负责

2、开放封闭原则(OCP)

对扩展开放,修改封闭

3、里氏替换原则(LSP)

可以使用任何派生类替换基类

4、接口分离原则(ISP)

对于接口进行分类避免一个接口的方法过多

5、依赖倒置原则(DIP)

隔离关系,使用接口或抽象类代指

6、依赖注入(DI)和控制反转原则(ICO)

使用钩子再原来执行流程中注入其他对象

接口:

?

抽象类抽象方法

?

抽象类, 抽象方法:

抽象类中只能有抽象方法,子类继承抽象类时,不能通过实例化使用其抽象方法,必须实现该方法。py3引入了abc模块

class Foo(object):def exec(self):raise NotImplementedError('请实现exec方法')class A(Foo):passobj=A()obj.exec()类A继承类Foo,因而拥有类Foo的所有属性。类A实例化一个对象obj,obj调用exec()方法,如果类A自己没有定义exec方法,就会主动抛出异常(raise)。

from abc import abstractmethod,ABCMetaclass Foo(metaclass=ABCMeta):@abcstractmethoddef exec(self):passclass A(Foo):passobj=A()从abc模块调用类abstractmethod和类ABCMeta,自己定义类Foo,继承抽象类ABCMeta,在类Foo中定义exec方法,并添加装饰器abcstractmethod。定义类A继承类Foo,并实例化对象obj,类A中必须有类Foo中的方法否则就会抛出异常。

组合:

class SqlHelper:def fetch_one(self):passdef fetch_all(self):passclass UserInfo:def __init__(self,helper):self.s = helperdef login(self):#数据库操作 self.s.fetch_one()def logout(self):# 数据库操作 self.s.fetch_one()def user_list(self):# 数据库操作 self.s.fetch_all()h = SqlHelper()obj = UserInfo(h)obj.login()#为了降低耦合,使代码减少依赖,将SqlHelper作为参数helper传递进去,两个类之间就没有直接依赖挂关系,叫做组合

引入依赖注入

解释器解释类的流程

?

依赖注入在什么之前做什么操作

?

?

依赖注入案例二:

class Mapper:__mapper_relation = {}#私有化@staticmethod#静态方法def register(cls, value):Mapper.__mapper_relation[cls] = value#私有字段,类等于值@staticmethoddef exist(cls): ###判断是否在里面if cls in Mapper.__mapper_relation:return Truereturn False@staticmethoddef value(cls):return Mapper.__mapper_relation[cls]class MyType(type):def __call__(cls, *args, **kwargs): ##执行Type的__call__方法,这里的cls就是<__main__.Foo object at 0x001B59F0> Foo类obj = cls.__new__(cls, *args, **kwargs) ##Foo的__new__方法arg_list = list(args)if Mapper.exist(cls):value = Mapper.value(cls)arg_list.append(value)obj.__init__(*arg_list, **kwargs) ##在执行Foo的__init__的之前做什么操作return objclass Foo(metaclass=MyType):def __init__(self, name):self.name = namedef f1(self):print(self.name)class Bar(metaclass=MyType):def __init__(self, name):self.name = namedef f1(self):print(self.name)Mapper.register(Foo, '666')Mapper.register(Bar, '999')obj = Foo()print(obj)print(obj.name)b = Bar()print(b.name)# <__main__.Foo object at 0x00583810># 666# 999

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。