python 父类实例化子类,替换__init__方法(记录) 2018-09-06

阅读 tornado的时候发现,tornado的AsyncHTTPClient的初始化,是没有调用init方法,而是调用了自己写的一个方法,一直不明白原因。
tornado Asynchttpclient 实例过程 AsyncHTTPClient--->Configurable--->SimpleAsyncHTTPClient 进行一个实例

说明:在new方法中返回了对象实例时,再调用已经写好的对象实例方法进行对属性进行初始化、赋值等操作,最后把初始化完成后的对象返回既可实现,不用调用init方法进行初始化

  1. 必须返回初始化完成的对象,否则会报错
  2. 初始化方法必须指向对象实例(self)
class asd():
    def __new__(cls, *args, **kwargs):
        r=super().__new__(cls)
        print('asd 的 new ')
        r.initliz(*args,**kwargs)
        return r  #必须返回否则会报错

class bnm(asd):
    def initliz(self): # 必须指向对象实例
        print('bnm 的 initlize')

    def kj(self,name):
        print('kj')
        self.xx=name
        print(self.xx)

class foo(bnm):
    def initliz(self,name=None):
        self.name=name
        print(' foo is running')

r=bnm()
r.kj('注册')
r2=foo(name='小明')

参考

你可能感兴趣的:(python 父类实例化子类,替换__init__方法(记录) 2018-09-06)