SOLIP設計原則
一、單一責任原則(SRP)
一個對象對只應該爲一個元素負責
二、開放封閉原則(OCP)
對擴展開放,修改封閉
三、里氏替換原則(LSP)
能夠使用任何派生類替換基類
四、接口分離原則(ISP)
對於接口進行分類避免一個接口的方法過多
五、依賴倒置原則(DIP)
隔離關係,使用接口或抽象類代指
六、依賴注入(DI)和控制反轉原則(ICO)
使用鉤子再原來執行流程中注入其餘對象python
# =================================================如下是接口 class IorderRepository: ##接口 def fetch_one_by(self,nid): ''' 獲取單條數據的方法,全部的繼承呢當前類的類必須繼承 :param nid: :return: ''' # raise Exception('子類中必須包含該方法') class OrderReposititory(IorderRepository): #類 def fetch_one_by(self,nid): print(nid) obj = OrderReposititory() obj.fetch_one_by(1)
import abc class Foo(metaclass=abc.ABCMeta): ##抽象類 def f1(self): print(123) def f2(self): print(456) @abc.abstractmethod ##抽象方法 def f3(self): ''' ??? :return: ''' class Bar(Foo): def f3(self): print(33333) b = Bar() b.f3()
解釋器解釋類的流程app
# ======================================解釋器解釋類的流程=================== # 解釋器解釋: # class Foo: # def __init__(self): # self.name =123 # def f1(self): # print(self.name) # 1.遇到class Foo,執行type的__init__方法 # 2.type的init的方法作什麼呢!不知道 # obj =Foo() # obj.f1() # 3.執行Type的__call__方法 # 執行Foo類的__new__方法 # 執行Foo類的__init__方法
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__方法 print('-------------') obj.__init__(*args, **kwargs) ##在執行Foo的__init__的以前作什麼操做 return obj class Foo(metaclass=MyType): def __init__(self, name): print('============') self.name = name def f1(self): print(self.name) obj = Foo(123) print(obj) print(obj.name)
#=================================依賴注入案例一====================================== 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__方法 if cls == Foo1: obj.__init__(Foo()) elif cls == Foo2: obj.__init__(Foo1()) return obj class Foo(metaclass=MyType): def __init__(self, args): print('============') self.name = args def f(self): print(self.name) class Foo1(metaclass=MyType): def __init__(self, args): print('============') self.name = args def f1(self): print(self.name) class Foo2(metaclass=MyType): def __init__(self, args): print('============') self.name = args def f2(self): print(self.name) obj = Foo2() obj.f2() # <__main__.Foo1 object at 0x002DA4F0>
#######################依賴注入案例二==================================================== # # class Mapper: # __mapper_relation = {} # # @staticmethod # def register(cls, value): # Mapper.__mapper_relation[cls] = value # # @staticmethod # def exist(cls): ###判斷是否在裏面 # if cls in Mapper.__mapper_relation: # return True # return False # # @staticmethod # def 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 obj # # # class Foo(metaclass=MyType): # def __init__(self, name): # self.name = name # # def f1(self): # print(self.name) # # # class Bar(metaclass=MyType): # def __init__(self, name): # self.name = name # # def 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