组合

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

组合举例
# 组合就是多个类,或者若干类联合起来完成一个任务
# 下面举例两个类联合起来完成一个任务
# 为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来
# 这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类
# 最好能动态实例化类并传参(依赖注入),后面讲到
class shujukulianjie:
"""
连接数据库类
"""
def __init__(self, host):
self.host = host def lianjie(self):
"""
连接数据库
"""
print("连接数据库{host}".format(host=self.host)) def guanbi(self):
"""
关闭数据库
"""
print("连接数据库{host}".format(host=self.host)) class yhucaozuo:
"""
用户操作类
"""
def __init__(self, shujuk):
self.shujuk = shujuk def yhdlu(self, user):
"""
用户登录
"""
self.shujuk.lianjie()
print("用户{user}登录成功!".format(user=user)) obj_shujukulianjie = shujukulianjie("127.0.0.1") obj_yhucaozuo = yhucaozuo(obj_shujukulianjie)
obj_yhucaozuo.yhdlu("abcde")

创建类的本质

class shujukulianjie:
def __init__(self, host):
self.host = host def lianjie(self):
"""
连接数据库
"""
print("连接数据库{host}".format(host=self.host)) obj_shujukulianjie = shujukulianjie("127.0.0.1") # 类创建的本质
# 类是由Type创建的
# 当实例化一个对象时,都经过了哪些
# 1.执行Type的__call__方法
# 在__call__方法里执行shujukulianjie类的__new__方法
# 在__call__方法里执行shujukulianjie类的__init__方法

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

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


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

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

自定义type类
class MyType(type):
print('执行__call__') def __call__(cls, *args, **kwargs):
print('执行__new__')
obj = cls.__new__(cls, *args, **kwargs) print('执行__init__')
obj.__init__("127.0.0.1") return obj # 继承type类,此类就会由自定义type类创建
class shujukulianjie(metaclass=MyType):
def __init__(self, host):
self.host = host def lianjie(self):
"""
连接数据库
"""
print("连接数据库{host}".format(host=self.host)) obj_shujukulianjie = shujukulianjie()
obj_shujukulianjie.lianjie()
# 类创建的本质
# 类是由Type创建的
# 当实例化一个对象时,都经过了哪些
# 1.执行Type的__call__方法
# 在__call__方法里执行shujukulianjie类的__new__方法
# 在__call__方法里执行shujukulianjie类的__init__方法

叫卖录音网
录音网站

依赖关系注入

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

依赖关系注入类
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] # 自定义type类
class MyType(type):
def __call__(cls, *args, **kwargs):
obj = cls.__new__(cls, *args, **kwargs)
arg_list = list(args)
if Mapper.exist(cls):
value = Mapper.value(cls)
arg_list.append(value)
obj.__init__(*arg_list, **kwargs) return obj # 继承type类,此类就会由自定义type类创建
class shujukulianjie(metaclass=MyType):
def __init__(self, name):
self.name = name def lianjie(self):
"""
连接数据库
"""
print("连接数据库{name}".format(name=self.name)) class yhucaozuo(metaclass=MyType):
"""
用户操作类
"""
def __init__(self, name):
self.name = name def yhdlu(self, user):
"""
用户登录
"""
self.name.lianjie()
print("用户{user}登录成功!".format(user=user)) # 依赖关系注入,就是将类与类之间的依赖关系,通过创建类时的__call__方法,在执行__init__方法之前,注入到__init__方法里
# 依赖关系注入,register()
# 第一个参数依赖关系名称
# 第二个参数依赖关系值
# 如果一个来需要继承另外一个类。名称为子类的名称,值为实例化父类,这样父类将注入到子类的__init__方法里,这样就完成了继承
Mapper.register(shujukulianjie,'127.0.0.1')
Mapper.register(yhucaozuo,shujukulianjie()) obj = yhucaozuo()
obj.yhdlu('adc')
												

第四百一十三节,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. (文件操作)Android相关的File文件操作

    判断文件是否存在: /** * 判断文件是否存在 * * @param path 文件路径 * @return [参数说明] * @return boolean [返回类型说明] */ public ...

  2. SpringMVC url匹配却404,SimpleUrlHandlerMapping不起作用

    代码如下: <mvc:default-servlet-handler/> <bean class="org.springframework.web.servlet.hand ...

  3. Java 泛型 介绍

    为什么需要泛型? public class GenericTest { public static void main(String[] args) { List list = new ArrayLi ...

  4. R图表入门

    R图表入门 R语言最强的功能就是统计和作图了,在学习了基本语法之后,博主马上体验了一下R的图表功能 条形图 例1 H = c(7,12,28,3,41) M = c("Mar",& ...

  5. django之视图获取用户请求相关信息以及请求头

    def index(request): print(type(request)) print(request.environ['HTTP_USER_AGENT'])#字典格式 print(reques ...

  6. linux 修改时间和时区

    linux系统时间有两个,一个是硬件时间,即BIOS时间,就是我们进行CMOS设置时看到的时间,另一个是系统时间,是linux系统Kernel时间.当Linux启动时,系统Kernel会去读取硬件时钟 ...

  7. Java第一章

    第一章 计算机程序:计算机为完成某些功能产生的一系列有序指令集合. Java技术包括:JavaSE(标准版)  JavaEE(企业版) ---JavaME(移动版) 开发Java程序步骤:1.编写 2 ...

  8. startup 环境搭配

    1.登入下载网址 www.apache.org 选择  Tomcat 3. 解压后的 4. 关闭了就可以互相访问了 在浏览器上也可以的访问的直接http://然后你的ID号就OK了

  9. CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)

    说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.r ...

  10. 使用Regsvr32.exe程序注册/注销ActiveX控件

    使用ActiveX控件之前需要注册该控件. 使用Regsvr32.exe程序可以注册.注销ActiveX控件. Regsvr32.exe程序位于Windows目录的system子目录下. 可以在cmd ...