组合

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

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

    非常感谢zhblue贡献了这么美丽的代码 为了开发适合自己学校的oj,努力研读代码中,不断的百度,调试,测试 对ubutun,linux的各种文件系统,进程系统,c编程都学习了不少 给大家分享下,希望 ...

  2. Java基础-对象的内存分配与初始化(一定要明白的干货)

    首先,什么是类的加载?类的加载由类加载器执行.该步骤将查找字节码(classpath指定目录),并从这些字节码中创建一个Class对象.Java虚拟机为每种类型管理一个独一无二的Class对象.也就是 ...

  3. Hass.io: add-on Samba

    { "workgroup": "WORKGROUP", "name": "hassio", "guest&qu ...

  4. python之对象(实例)

    1.对象是关于类而实际存在的一个例子,即实例 #类实例化得到g1这个实例 class Garen: camp='Demacia' def __init__(self,nickname,aggressi ...

  5. hbase.client.keyvalue.maxsize的默认值

    hbase的列族的最大值是在hbase配置里的hbase.client.keyvalue.maxsize,默认大小为10M,即 10485760 . http://eclecl1314-163-com ...

  6. Linux中的普通命令如何以管理员身份运行

    set uid, gid, sticky bit 权限 一个文件都有一个所有者, 表示该文件是谁创建的.同时, 该文件还有一个组编号, 表示该文件所属的组, 一般为文件所有者所属的组.如果是一个可执行 ...

  7. Centos yum国内源及配置含义

    Centos yum源的位置: /etc/yum.repos.d,可以通过配置文件/etc/yum.conf指定其他位置 主要的yum源种类:前两个是必须的,不然yum安装很多软件时会失败.yum本来 ...

  8. fastjson转换json字符串key的首字母小写变大写的解决办法

    https://blog.csdn.net/erbao_2014/article/details/53688934 问题描述在开发过程中,由于接口文档的描述,要求json字符串的key首字母为大写,而 ...

  9. 发送HTTPS请求

    package com.suning.epp.trt.util.r32epp; import java.io.BufferedInputStream; import java.io.IOExcepti ...

  10. HIVE开发总结

    基本数据类型 查看所有函数 搜索函数 搜索表 查看函数使用方法 关键字补全 显示表头 SET环境变量 查看建表语句.数据文件置 执行外部命令 NVL CONCAT IF CASE TRIM SUBST ...