python 抽象類、抽象方法、接口、依賴注入、SOLIP

 

 

一、程序設計原則:SOLIP

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
相關文章
相關標籤/搜索