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