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

  

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

  1. Python抽象类和接口类

    一.抽象类和接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名) ...

  2. Java 抽象类 抽象方法 接口

    #抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不能实例化 ...

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

    #python没有类似于java和C#的接口类(interface),需要使用抽象类 和抽象方法来实现接口功能 #!/usr/bin/env python#_*_ coding:utf-8 _*_ f ...

  4. python 抽象类和接口类

    一.接口类 继承的两种用途: 1.继承基类的方法,并且做出自己的改变或者扩展(代码重用) 2.声明某个子类兼容于某个基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数 名)  ...

  5. python 抽象类与接口类

    几个类 实现的方法都一致的话 就继承同一个父类 在父类写一个公共方法 给子类使用

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

    原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository-pat ...

  7. Spring 依赖注入优化

    Spring 依赖注入优化 原创: carl.zhao SpringForAll社区 今天 Spring 最大的好处就是依赖注入,关于什么是依赖注入,在Stack Overflow上面有一个问题,如何 ...

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

    标签: 原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/crud-operations-using-the-generic-repository ...

  9. python中的接口和依赖注入

    首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束 python的类是可以写任意个方法的 定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有 ...

随机推荐

  1. 【原创】C#模拟Post请求,正文为json数据的代码参考

    由于之前一直在做键值对post数据的提交,没遇到过json正文的提交,遇到的问题截图: 对于此种情况的post,我用 谷歌插件 PostMan 模拟试了下成功了,截图如下: Postman插件在你选择 ...

  2. Sublime Text 2 快捷操作

    Sublime Text 2 包含了大量快捷操作,而且还很方便修改和追加自己喜欢的快捷键. 查看快捷键的方式也很简单: 点击菜单栏:Preferences->Key Bindings –Defa ...

  3. redis开启远程访问

    redis默认只允许本地访问,要使redis可以远程访问可以修改redis.conf   打开redis.conf文件在NETWORK部分有说明   ######################### ...

  4. elasticsearch高级配置二----线程池设置

    一个Elasticsearch节点会有多个线程池,但重要的是下面四个: 索引(index):主要是索引数据和删除数据操作(默认是cached类型) 搜索(search):主要是获取,统计和搜索操作(默 ...

  5. 菜鸟快飞之JavaScript对象、原型、继承(二)

    上一节写了创建对象的三种方法,而其中通过函数创建对象的方式又有三种模式,分别是工厂模式.构造函数模式.原型模式.而这三种模式最常用的则是原型模式.还是上栗子: 工厂模式: function Fun1( ...

  6. 纯CSS3实现多层云彩变换飞行动画

    查看效果:http://hovertree.com/texiao/css3/4/效果2 效果图: 代码如下: <!doctype html> <html lang="zh& ...

  7. [deviceone开发]-do_Webview加载JQueryMobile的示例

    一.简介 JQueryMobile是JQuery的移动版,不过它并没有像JQuery那么成功.我们只是使用JQueryMobile来展示do_Webview加载第三方js框架.适合所有开发者.二.效果 ...

  8. css和@import区别用法

    css和@import都是调用外部样式表的方法. 一.用法 (1)link: <link rel="stylesheet" type="text/css" ...

  9. Atitit.uke 团队建设的组织与运营之道attilax总结

    Atitit.uke 团队建设的组织与运营之道attilax总结 1. intro引言:2 2. aims组织成立宗旨2 1.1. Mission组织使命2 1.2. val核心价值观2 1.3. c ...

  10. Angularjs-项目搭建

    开发工具采用WebStorm,没破解,使用了过期策略:安装之后不着急打开程序,先设置系统日期为未来的某个日期,比如2020年.然后再打开程序,试用.然后再改回来系统日期.虽然每次打开WebStorm都 ...