第四百一十三节,python面向对象,组合、类创建的本质、依赖注入
组合
组合举例
组合就是多个类,或者若干类联合起来完成一个任务
下面举例两个类联合起来完成一个任务
为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来
这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类
最好能动态实例化类并传参(依赖注入),后面讲到
- 组合举例
# 组合就是多个类,或者若干类联合起来完成一个任务
# 下面举例两个类联合起来完成一个任务
# 为了降低代码的耦合度,我们一般不会在一个类里实例化另外一个类,都是将一个类在外面实例化后传参到另外一个来
# 这样就带来了一个问题,如果有很多类相互继承,我们就需要在外面实例化很多类
# 最好能动态实例化类并传参(依赖注入),后面讲到
- 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面向对象,组合、类创建的本质、依赖注入的更多相关文章
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- 第四百一十六节,Tensorflow简介与安装
第四百一十六节,Tensorflow简介与安装 TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统,克服了第一代系统DistBelief仅能开发神经网络算法.难 ...
- 第三百一十三节,Django框架,Session
第三百一十三节,Django框架,Session Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 1.数据库(默认)2.缓存3.文件4.缓存+数据库5.加密c ...
- Python面向对象02/类的空间问题、类与对象之间的关系、类与类之间的关系
Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 目录 Python面向对象02/类的空间问题.类与对象之间的关系.类与类之间的关系 1. 类的空间问题 2. 类与对象之间 ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- Python 面向对象之一 类与属性
Python 面向对象之 类与属性 今天接触了一下面向对象,发现面向对象和之前理解的简直就是天壤之别,在学Linux的时候,一切皆文件,现在学面向对象了,so,一切皆对象. 之前不是一直在学的用面向函 ...
- Python 面向对象 组合-多态与多态性-封装-property
面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...
- python面向对象(二)——类成员
Python面向对象 类成员 1.字段 普通字段 属于对象 静态字段 属于类 2.方法 普通方法 触发者是对象 括号里至少一个参数 se ...
- python 面向对象二 类和实例
一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...
随机推荐
- mongoose查询
Model.findOne({ age:5},function(err, doc){// doc 是单个文档}); 与 findOne 相同,但它接收文档的 _id 作为参数,返回单个文档._id 可 ...
- Making the Grade [POJ3666] [DP]
题意: 给定一个序列,以最小代价将其变成单调不增或单调不减序列,代价为Σabs(i变化后-i变化前),序列长度<=2000,单个数字<=1e9 输入:(第一行表示序列长度,之后一行一个表示 ...
- Android Studio 2.3 解决小米手机调试安装apk失败问题
在开发者选项里面,拉到底,把miui优化选项去掉就好了. 参考资料 [问题反馈] Android Studio 2.3 在红米note3手机中 调试安装Apk失败
- 3ds max学习笔记(五)--操作工具
一些快捷:移动,旋转,缩放右键可调整数据或者直接右键点开也可以看到或者快捷键W,E,R 复制物体:摁住shift+移动工具,往想要复制的位置拖拽(实例方式复制)亦可选择多个父对象
- Idea-每次修改JS文件都需要重启Idea才能生效解决方法
最近开始使用Idea,有些地方的确比eclipse方便.但是我发现工程每次修改JS或者是JSP页面后,并没有生效,每次修改都需要重启一次Tomcat这样的确不方便.我想Idea肯定有设置的方法,不可能 ...
- vim查找格式
使用了VIM这么久,却一直无法牢记一些基本的操作指令.今天查找一个关键字时,想不起来怎么查找“下一个”,于是google之并解决,顺便把有用的都贴过来罢. 查找指令:/xxx 往下查找?xxx 往上 ...
- 2018年东北农业大学春季校赛 E-wyh的阶乘(求n!的0的个数)
链接:https://www.nowcoder.com/acm/contest/93/E来源:牛客网 题目描述 这个问题很简单,就是问你n的阶乘末尾有几个0? 输入描述: 输入第一行一个整数T(1&l ...
- 【转】Selenium - 封装WebDrivers (C#)
本文转载自:http://www.cnblogs.com/qixue/p/3977135.html Web element仍然使用OpenQA.Selenium.IWebElement, 本类库将Se ...
- NLP 第7章 文本向量化
- self.location.href
self.location.href;//当前页面打开URL页面 window.location.href;//当前页面打开URL页面 this.location.href;//当前页面打开URL页面 ...