0
点赞
收藏
分享

微信扫一扫

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)

Python中__new__方法的详细教程_类对象


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))

Python中__new__方法的详细教程_开发语言_02


由结果得知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)

Python中__new__方法的详细教程_类对象_03


举报

相关推荐

0 条评论