第四百一十三节,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类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...
随机推荐
- React-Native-Storage使用介绍
react-native-storage 这是一个本地持久存储的封装,可以同时支持react-native(AsyncStorage)和浏览器(localStorage).ES6语法,promise异 ...
- BZOJ4970 : [ioi2004]empodia 障碍段
通过两遍单调栈求出每个点作为最小值往右延伸到$g[i]$,作为最大值往左延伸到$f[i]$. 那么一个区间$[i,j]$可行当且仅当$g[i]\geq j$.$f[j]\leq i$且$i-a[i]= ...
- [Codeforces896C] Willem, Chtholly and Seniorious (ODT-珂朵莉树)
无聊学了一下珂朵莉树 珂朵莉树好哇,是可以维护区间x次方和查询的高效数据结构. 思想大致就是一个暴力(相对而言)的树形数据结构 lxl毒瘤太强了,发明了ODT算法(Old Driver Tree老司机 ...
- 暗之的锁链 [COGS2434] [树上差分]
Description 无向图中有N个节点和两类边,一类边被称为主要边,而另一类被称为附加边.Dark有N – 1条主要边,并且Dark的任意两个节点之间都存在一条只由主要边构成的路径.另外,Dark ...
- 2017.07.06【NOIP提高组】模拟赛B组
Summary 今天比赛感觉题目很奇葩,都可以用许多简单方法来做,正确性都显然,当然也有点水,也就是说是考我们的数感和数学知识,而程序,只是代码的体现. 这次的时间安排感觉不错,因为很快就打完最后一道 ...
- 转 ef中使用mysql步骤--Entity Framework 6 with MySql
原文:http://lvasquez.github.io/2014/11/18/EntityFramework-MySql/ For the Entity Framework 6 support we ...
- delphi 响应鼠标进入控件消息
procedure MSGEnter(var msg:TMessage);message CM_MOUSEENTER;//响应进入的消息 procedure MSGLeave(var msg: TMe ...
- Elasticsearch集群运维
一.索引管理 1. 创建索引 PUT test-2019-03 { "settings": { "index": { "number_of_shard ...
- SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度
2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...
- NYOJ127 星际之门(一)【定理】
星际之门(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门 ...