python中的__new__方法(Python中__new__方法的详细教程)
只有继承于object的新式类才能有__new__方法 ,__new__方法在创建类实例对象时由Python解释器自动调用 ,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例 ,如果该类的父类也没有重写__new__ ,那么将一直按此规矩追溯至object的__new__方法 ,因为object是所有新式类的基类 ,若需要自定义__new__方法 ,一般用法如下:
class Person(object): def __new__(cls): return object.__new__(cls)__new__至少要有一个参数cls ,代表要实例化的类 ,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值 ,返回实例化出来的实例 ,可以return父类new出来的实例,或直接是object的new出来的实例 。
object.new(cls)执行完返回的结果为Person类的实例对象 ,如下:
class Person(object): def __init__(self): print("__init__") self.name="张三" def __new__(cls): print(__new__) ob = object.__new__(cls)#ob为Person实例对象 print(ob) return ob p1 = Person() print(p1.name)p1=Person()该语句主要做了以下工作:
首先调用Person的__new__方法 ,该方法通过object.new(cls)创建了Person实例对象,并返回 。最后调用了该Person实例对象的__new__方法 。object.new()方法接收的参数是类对象 ,可以不是当前类对象cls ,如果将cls换成其他类对象会发生什么呢,看下面代码的运行结果:
class Dog(object): def __init__(self): self.name="旺财" print("Dog.__init__") class Person(object): def __init__(self): self.name="张三" print("Person.__init__") def __new__(cls): print(__new__) ob = object.__new__(Dog) return ob p1 = Person() print(type(p1))由结果得知p1是Dog类的实例 ,但是有个问题 ,Python解释器没有自动执行__new__方法 ,由结果可以看出并没有打印字符串__new__ 。若__new__()没有正确返回当前类cls的实例 ,那__init__()将不会被调用 。 我们可以在__new__方法中手动调用__new__方法(实际开发中好像没什么用)
class Dog(object): def __init__(self): self.name="旺财" print("__init__") class Person(object): def __init__(self): self.name="张三" print("__init__") def __new__(cls): print(__new__) ob = object.__new__(Dog) ob.__init__() return ob p1 = Person() print(type(p1)) print(p1.name)创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!