python中的__new__概念(工厂

来源:互联网 发布:sql应用程序在哪里 编辑:程序博客网 时间:2024/06/04 18:09

__new__方法实际上在__init__方法之前执行,用于创建类的实例。然而__init__方法负责实例创建后对其进行自定义,__new__方法才是实际上创建并返回实例的方法。

__new__方法的第一个也是最重要的参数是创建实例所需的要的类(按照惯例,命名为cls)。

在大多数起概况下,__new__方法的其他参数会被完整复制到__init__方法中。参数在调用类构造函数时首先会被传递给__new__方法,然后再传递给__init__方法。

在实际应用中,大多数类无需定义__new__方法。该方法在python中的内置实现已经足够。

通常,我们希望__new__方法返回一个已经被初始化后的类的实例。在某些情况下,并不需要这么做。需要注意的是,只有在通过__new__方法返回当前类的实例时才会执行__init__方法。如果返回的不是当前类的实例,就不会调用__init__方法。

 

class MyClass(object):

    def __new__(cls,a):

        print("__new__ 被调用,参数为:%d"%a)

        #在实现__new__方法的时候,应该首先调用父类的__new__方法

        #然后再开始自定义的逻辑

        #调用父类__new__方法创建实例,并返回

        return object.__new__(cls)

 

    def __init__(self,a):

        print("__init__被调用,参数为:%d"%a)

 

 

#解释器先将参数100传递给__new__方法

#如果__new__方法创建对象,那么会调用__init__方法

#这时会将参数100再传递给__init__方法

mclass = MyClass(100)

 

总结

    • __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;
    • __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例;
    • __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值;
    • 我们可以将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节。