文档章节

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

o
 osc_x4h57ch8
发布于 2018/04/24 09:07
字数 1172
阅读 0
收藏 0
def

精选30+云产品,助力企业轻松上云!>>>

组合

 

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

 

 

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


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')

 

 

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

平时使用的Lszrz到底是什么协议?说说Xmodem/Ymodem/Zmodem

XMODEM, YMODEM, and ZMODEM 由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。 sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和z...

独钓渔
52分钟前
17
0
真正的强智能时代已经到来。道翰天琼认知智能机器人平台API大脑。

最近,我常说人工智能的寒冬快要来了,提醒业界要做好思想准备,但同时我也说:冬天来了,春天就不会远了…… 2019年6月我写了篇文章《深度学习的问题究竟在哪?》,说到深度学习的一个主要问...

jackli2020
今天
24
0
什么是控制型人格,控制型人格的筛查测试

一、 什么是控制性人格 拥有控制型人格的人,他们会尽力的隐藏自己的意图,但是又会使用很微妙的方式来利用周围人的弱点,进而占取便宜时,使他们能够得到自己想要的东西。这类人的控制欲非常...

蛤蟆丸子
今天
14
0
【Spring】Spring AOP 代理对象生成逻辑源码分析

1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */public interface TargetInterface { void show(); String show......

ZeroneLove
今天
36
0
聊聊dubbo-go的gracefulShutdownFilter

序 本文主要研究一下dubbo-go的gracefulShutdownFilter gracefulShutdownFilter dubbo-go-v1.4.2/filter/filter_impl/graceful_shutdown_filter.go type gracefulShutdownFilter struct {......

go4it
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部