组合

组合举例
组合就是多个类,或者若干类联合起来完成一个任务
下面举例两个类联合起来完成一个任务
为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来
这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类
最好能动态实例化类并传参(依赖注入),后面讲到

  1. 组合举例
    # 组合就是多个类,或者若干类联合起来完成一个任务
    # 下面举例两个类联合起来完成一个任务
    # 为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来
    # 这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类
    # 最好能动态实例化类并传参(依赖注入),后面讲到
  2.  
  1. class shujukulianjie:
  2. """
  3. 连接数据库类
  4. """
  5. def __init__(self, host):
  6. self.host = host
  7.  
  8. def lianjie(self):
  9. """
  10. 连接数据库
  11. """
  12. print("连接数据库{host}".format(host=self.host))
  13.  
  14. def guanbi(self):
  15. """
  16. 关闭数据库
  17. """
  18. print("连接数据库{host}".format(host=self.host))
  19.  
  20. class yhucaozuo:
  21. """
  22. 用户操作类
  23. """
  24. def __init__(self, shujuk):
  25. self.shujuk = shujuk
  26.  
  27. def yhdlu(self, user):
  28. """
  29. 用户登录
  30. """
  31. self.shujuk.lianjie()
  32. print("用户{user}登录成功!".format(user=user))
  33.  
  34. obj_shujukulianjie = shujukulianjie("127.0.0.1")
  35.  
  36. obj_yhucaozuo = yhucaozuo(obj_shujukulianjie)
  37. obj_yhucaozuo.yhdlu("abcde")

创建类的本质

  1. class shujukulianjie:
  2. def __init__(self, host):
  3. self.host = host
  4.  
  5. def lianjie(self):
  6. """
  7. 连接数据库
  8. """
  9. print("连接数据库{host}".format(host=self.host))
  10.  
  11. obj_shujukulianjie = shujukulianjie("127.0.0.1")
  12.  
  13. # 类创建的本质
  14. # 类是由Type创建的
  15. # 当实例化一个对象时,都经过了哪些
  16. # 1.执行Type的__call__方法
  17. # 在__call__方法里执行shujukulianjie类的__new__方法
  18. # 在__call__方法里执行shujukulianjie类的__init__方法

讲依赖注入前我们需了解一下类创建的本质

类创建的本质
类是由Type创建的
当实例化一个对象时,都经过了哪些
1.执行Type的__call__方法
   
在__call__方法里执行shujukulianjie类的__new__方法
   
在__call__方法里执行shujukulianjie类的__init__方法

  1.  

可以看到执行Type的__call__方法是隐形的

自定义type类
继承自定义type类的类,会由自定义type类创建

  1. 自定义type
  2. class MyType(type):
  3. print('执行__call__')
  4.  
  5. def __call__(cls, *args, **kwargs):
  6. print('执行__new__')
  7. obj = cls.__new__(cls, *args, **kwargs)
  8.  
  9. print('执行__init__')
  10. obj.__init__("127.0.0.1")
  11.  
  12. return obj
  13.  
  14. # 继承type类,此类就会由自定义type类创建
  15. class shujukulianjie(metaclass=MyType):
  16. def __init__(self, host):
  17. self.host = host
  18.  
  19. def lianjie(self):
  20. """
  21. 连接数据库
  22. """
  23. print("连接数据库{host}".format(host=self.host))
  24.  
  25. obj_shujukulianjie = shujukulianjie()
  26. obj_shujukulianjie.lianjie()
  27. # 类创建的本质
  28. # 类是由Type创建的
  29. # 当实例化一个对象时,都经过了哪些
  30. # 1.执行Type的__call__方法
  31. # 在__call__方法里执行shujukulianjie类的__new__方法
  32. # 在__call__方法里执行shujukulianjie类的__init__方法

叫卖录音网
录音网站

依赖关系注入

依赖关系注入,就是将类与类之间的依赖关系,通过创建类时的__call__方法,在执行__init__方法之前,注入到__init__方法里
如果一个来需要继承另外一个类。名称为子类的名称,值为实例化父类,这样父类将注入到子类的__init__方法里,这样就完成了继承

  1. 依赖关系注入类
  2. class Mapper:
  3. __mapper_relation = {}
  4.  
  5. @staticmethod
  6. def register(cls, value):
  7. Mapper.__mapper_relation[cls] = value
  8.  
  9. @staticmethod
  10. def exist(cls):
  11. if cls in Mapper.__mapper_relation:
  12. return True
  13. return False
  14.  
  15. @staticmethod
  16. def value(cls):
  17. return Mapper.__mapper_relation[cls]
  18.  
  19. # 自定义type类
  20. class MyType(type):
  21. def __call__(cls, *args, **kwargs):
  22. obj = cls.__new__(cls, *args, **kwargs)
  23. arg_list = list(args)
  24. if Mapper.exist(cls):
  25. value = Mapper.value(cls)
  26. arg_list.append(value)
  27. obj.__init__(*arg_list, **kwargs)
  28.  
  29. return obj
  30.  
  31. # 继承type类,此类就会由自定义type类创建
  32. class shujukulianjie(metaclass=MyType):
  33. def __init__(self, name):
  34. self.name = name
  35.  
  36. def lianjie(self):
  37. """
  38. 连接数据库
  39. """
  40. print("连接数据库{name}".format(name=self.name))
  41.  
  42. class yhucaozuo(metaclass=MyType):
  43. """
  44. 用户操作类
  45. """
  46. def __init__(self, name):
  47. self.name = name
  48.  
  49. def yhdlu(self, user):
  50. """
  51. 用户登录
  52. """
  53. self.name.lianjie()
  54. print("用户{user}登录成功!".format(user=user))
  55.  
  56. # 依赖关系注入,就是将类与类之间的依赖关系,通过创建类时的__call__方法,在执行__init__方法之前,注入到__init__方法里
  57. # 依赖关系注入,register()
  58. # 第一个参数依赖关系名称
  59. # 第二个参数依赖关系值
  60. # 如果一个来需要继承另外一个类。名称为子类的名称,值为实例化父类,这样父类将注入到子类的__init__方法里,这样就完成了继承
  61. Mapper.register(shujukulianjie,'127.0.0.1')
  62. Mapper.register(yhucaozuo,shujukulianjie())
  63.  
  64. obj = yhucaozuo()
  65. obj.yhdlu('adc')
  1.  

第四百一十三节,python面向对象,组合、类创建的本质、依赖注入的更多相关文章

  1. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  2. 第四百一十六节,Tensorflow简介与安装

    第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...

  3. 第三百一十三节,Django框架,Session

    第三百一十三节,Django框架,Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 1.数据库(默认)2.缓存3.文件4.缓存+数据库5.加密c ...

  4. Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系

    Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...

  5. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  6. Python 面向对象之一 类与属性

    Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...

  7. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

  8. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  9. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

随机推荐

  1. mongoose查询

    Model.findOne({ age:5},function(err, doc){// doc 是单个文档}); 与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档._id 可 ...

  2. Making the Grade [POJ3666] [DP]

    题意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,代价为Σabs(i变化后-i变化前),序列长度<=2000,单个数字<=1e9 输入:(第一行表示序列长度,之后一行一个表示 ...

  3. Android Studio 2.3 解决小米手机调试安装apk失败问题

    在开发者选项里面,拉到底,把miui优化选项去掉就好了. 参考资料 [问题反馈] Android Studio 2.3 在红米note3手机中 调试安装Apk失败

  4. 3ds max学习笔记(五)--操作工具

    一些快捷:移动,旋转,缩放右键可调整数据或者直接右键点开也可以看到或者快捷键W,E,R 复制物体:摁住shift+移动工具,往想要复制的位置拖拽(实例方式复制)亦可选择多个父对象

  5. Idea-每次修改JS文件都需要重启Idea才能生效解决方法

    最近开始使用Idea,有些地方的确比eclipse方便.但是我发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能 ...

  6. vim查找格式

    使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个关键字时,想不起来怎么查找“下一个”,于是google之并解决,顺便把有用的都贴过来罢. 查找指令:/xxx 往下查找?xxx 往上  ...

  7. 2018年东北农业大学春季校赛 E-wyh的阶乘(求n!的0的个数)

    链接:https://www.nowcoder.com/acm/contest/93/E来源:牛客网 题目描述 这个问题很简单,就是问你n的阶乘末尾有几个0? 输入描述: 输入第一行一个整数T(1&l ...

  8. 【转】Selenium - 封装WebDrivers (C#)

    本文转载自:http://www.cnblogs.com/qixue/p/3977135.html Web element仍然使用OpenQA.Selenium.IWebElement, 本类库将Se ...

  9. NLP 第7章 文本向量化

  10. self.location.href

    self.location.href;//当前页面打开URL页面 window.location.href;//当前页面打开URL页面 this.location.href;//当前页面打开URL页面 ...