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

1、程序设计原则:SOLIP

SOLIP设计原则
  1、单一责任原则(SRP)
    一个对象对只应该为一个元素负责
  2、开放封闭原则(OCP)
    对扩展开放,修改封闭
  3、里氏替换原则(LSP)
    可以使用任何派生类替换基类
  4、接口分离原则(ISP)
    对于接口进行分类避免一个接口的方法过多
  5、依赖倒置原则(DIP)
    隔离关系,使用接口或抽象类代指
  6、依赖注入(DI)和控制反转原则(ICO)
    使用钩子再原来执行流程中注入其他对象

接口:

# =================================================以下是接口
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()

  

引入依赖注入

解释器解释类的流程

# ======================================解释器解释类的流程===================
#  解释器解释:
# 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

  

时间: 2024-10-12 13:44:52

python 抽象类、抽象方法、接口、依赖注入、SOLIP的相关文章

Python抽象类和接口类

一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能. 实践中,继承的第一种含义意义并不很大,甚至常常是有害的.因为它使得子类与基类出现强耦合. 继承的第二种含义非常重要.它又叫"接口继承".接口继承实质上是要求"做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用

Java 抽象类 抽象方法 接口

#抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量.成员方法和构造方法的访问方式和普通类一样. 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用.也是因为这个原因,通常在设计阶段决定要不要设计抽象类. 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法. 在Java中抽象

python抽象类+抽象方法实现接口(interface)

#python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ from abc import ABCMetafrom abc import abstractmethod class Alert: __metaclass__= ABCMeta @abstractmethod def send(self): pass #继承抽象类class Weixin(Alert

python 抽象类和接口类

一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名)  且并未实现接口中的功能. 实践中,继承的第一种用法意义不大,有时候常常有害的.因为它使得子类与基类出现强耦合. 继承的第二种含义非常重要,它叫‘接口继承’. 接口继承是实质上要求‘做出一个良好的抽象’,这个抽象规定了一个兼容接口,使得外部调用者无需关心内部细节,可以一视同仁的处理实现特定接口的所有对

抽象类 抽象方法 接口 类部类 匿名类部类 设计模式之单例模式(懒汉模式及饿汉模式)

---恢复内容开始--- 抽象类  关键字  abstract 不能被实例化(创建对象),可通过类名调用静态方法 子类继承抽象类必须重写父类的所有抽象方法,然后用多态调用 接口:关键字 interface   类名 implements 接口名 1.接口中只能有抽象方法,并且不能被实例化,通过多态调用 2.接口与接口之间的关系: 继承关系(可以多继承); 类部类: 在类中定义的类 创建类部类对象    外部类名.内部类名  对象名 = new 外部类名().new内部类名() 匿名类部类: 在写

6.在MVC中使用泛型仓储模式和依赖注入实现增删查改

原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pattern-and-dep/ 系列目录: Relationship in Entity Framework Using Code First Approach With Fluent API[[使用EF Code-First方式和Fluent API来探讨EF中的关系]] Code First Mig

python中的接口和依赖注入

首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束 python的类是可以写任意个方法的 定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有什么方法,接口中不能任何功能代码 class Interface: def f1(self): ''' to do something :return: ''' class Something(Interface): def f1(self): print('to do something...')

【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)

目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前的习惯,我们还是新建几个文件夹 Commons:存放帮助类 Domians:数据模型 Services:接口和实现类 我们在Domains文件夹下添加一个类库 Domain 我们新建一个类 ApplicationDbContext 继承 DbContext 1 using Microsoft.Ent

抽象类和抽象方法接口和多态

抽象类与普通类的区别: 1.抽象类中可以写抽象方法,普通类不可以: 2.抽象类不能直接创建对象,普通类可以: 3.抽象类中可以没有抽象方法,但是仍然不能创建对象. 抽象类的常见问题 1.抽象类一定是父类,因为是不断向上抽取而来. 2.实际开发中,建议先写抽象的父类,在根据具体的子类编写功能. 3.有抽象方法的类一定是抽象类,在抽象类中,可以没有抽象方法. 没有抽象方法的类是一种特殊的设计模式:(适配器模式) 4.如果抽象A定义了一个抽象的a方法,如果B类继承A的时候,没有重写a方法,B类也必须抽