博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四百一十三节,python面向对象,组合、类创建的本质、依赖注入
阅读量:5906 次
发布时间:2019-06-19

本文共 3843 字,大约阅读时间需要 12 分钟。

组合

 

组合举例

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

 

 

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

 

 

 

转载地址:http://wjcpx.baihongyu.com/

你可能感兴趣的文章
Oracle的Java模块化系统保卫战
查看>>
苹果开源Swift基准测试套件
查看>>
Java程序员:不要因未知而让云成本大涨
查看>>
QCon上海2015 架构实战热点前瞻
查看>>
python学习笔记-使用@property、setter、deleter
查看>>
EF Core数据库Provider一览
查看>>
Ceylon语言加入Eclipse基金会
查看>>
阿里云Redis开发规范
查看>>
滴滴自研分布式NoSQL数据库Fusion的演进之路
查看>>
软件安全访谈:ZipSlip、NodeJS安全性和BBS攻击
查看>>
CSS3 animation 基础
查看>>
JS魔法堂:深究JS异步编程模型
查看>>
[译]开启webpack之旅( 四 ):使用插件
查看>>
编写高质量的CSS
查看>>
APP漏洞自动化扫描专业评测报告(下篇)
查看>>
[解題][zerojudge] a229: 括號匹配問題
查看>>
基础二:javascript面向对象、创建对象、原型和继承总结(下)
查看>>
360. Sort Transformed Array
查看>>
docker使用流程
查看>>
一次解决OOM的经历
查看>>