zoukankan      html  css  js  c++  java
  • 第四百一十三节,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')
    
    
    
  • 相关阅读:
    Excel导入SQL数据库完整代码
    获取google地图经纬度
    设为首页、加入收藏 兼容代码
    破解电脑开机密码
    微软的面试题
    ashx文件中使用session
    MetaEdit、修改IIS链接人数限制
    男人戴戒指的意义
    .Net/C#中Cache的用法
    SharedPreferences用于存储数据
  • 原文地址:https://www.cnblogs.com/adc8868/p/8926163.html
Copyright © 2011-2022 走看看