首页IT科技python中的__new__方法(Python中__new__方法的详细教程)

python中的__new__方法(Python中__new__方法的详细教程)

时间2025-06-20 23:53:29分类IT科技浏览3581
导读:只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有...

只有继承于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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
w10移动硬盘没有显示(Win10系统不显示移动硬盘该如何解决)