首页 > 编程 > Python > 正文

python中__new__和__init__

2019-11-08 18:35:17
字体:
来源:转载
供稿:网友
注:这是我的学习笔记,大部分内容来源一些博客。参考1:http://www.cnblogs.com/tuzkee/p/3540293.html概要:(1)__new__(cls, *args, **kwargs)在__init__(self, *args, **kwargs)之前,__new__必须返回构造的对象,至少有参数cls,参数的实例化由解释器提供,返回的对象即__init__的self,__init__可以没有返回值(2)__new__没有返回值,__init__是不会被调用的参考2:http://www.cnblogs.com/ifantastic/p/3175735.html(1): 可以这么理解,在 Python 中存在于类里面的构造方法 __init__() 负责将类的实例化,而在 __init__() 启动之前,__new__() 决定是否要使用该 __init__() 方法,因为__new__() 可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。(2): 如果将类比喻为工厂,那么__init__()方法则是该工厂的生产工人,__init__()方法接受的初始化参数则是生产所需原料,__init__()方法会按照方法中的语句负责将原料加工成实例以供工厂出货。而__new__()则是生产部经理,__new__()方法可以决定是否将原料提供给该生产部工人,同时它还决定着出货产品是否为该生产部的产品,因为这名经理可以借该工厂的名义向客户出售完全不是该工厂的产品(3): 第一个参数cls表示当前实例。(4):# 在任何新式类的__new__()方法,不能调用自身的__new__()来制造实例,因为这会造成死循环。因此必须避免类似以下的写法:# 在Foo中避免:return Foo.__new__(cls, *args, **kwargs)或return cls.__new__(cls, *args, **kwargs)。Child同理。class Foo(object):    def __init__(self, *args, **kwargs):        ...    def __new__(cls, *args, **kwargs):        return object.__new__(Stranger, *args, **kwargs) class Stranger(object):    ...foo = Foo()PRint(type(foo))    # 打印的结果显示foo其实是Stranger类的实例。# 因此可以这么描述__new__()和__ini__()的区别,在新式类中__new__()才是真正的实例化方法,为类提供外壳制造出实例框架,然后调用该框架内的构造方法__init__()使其丰满。# 如果以建房子做比喻,__new__()方法负责开发地皮,打下地基,并将原料存放在工地。而__init__()方法负责从工地取材料建造出地皮开发招标书中规定的大楼,__init__()负责大楼的细节设计,建造,装修使其可交付给客户。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表