init 方法为初始化方法, new 方法才是真正的构造函数。

1.__new__ 方法默认返回实例对象供 init 方法、实例方法使用。

class Foo(object):
    price = 50
    def how_much_of_book(self, n):
        return self.price * n
foo = Foo()

分析上面的代码,这个类实例化过程,Foo 类继承 object 类,继承了 object 的 new 方法。
当你没有重载这个方法,Foo 实例化是默认自动调用父类 new 方法,这个方法返回值为类的实例 (self),提供这个函数
how_much_of_book,默认的第一个参数 self。

class Foo(object):
    price = 50
    def __new__(cls, *agrs, **kwds):
        inst = object.__new__(cls, *agrs, **kwds)
        return inst
    def how_much_of_book(self, n):
        return self.price * n
foo = Foo()

Foo 类中重载了 new 方法,它的返回值为 Foo 类的实例对象。

2.__init__ 方法为初始化方法,为类的实例提供一些属性或完成一些动作。

class Foo(object):
    def __new__(cls, *agrs, **kwds):
        inst = object.__new__(cls, *agrs, **kwds)
        return inst
    def __init__(self, price=50):
        self.price = price
    def how_much_of_book(self, n):
        return self.price * n
foo = Foo()

3.__new__ 方法创建实例对象供 init 方法使用,__init__ 方法定制实例对象。__new__ 方法必须返回值,__init__ 方法不需要返回值。如果返回非 None 值就报错。

4.一般用不上 new 方法,__new__ 方法可以用在下面二种情况。继承不可变数据类型时需要用到 new 方法。

class Inch(float):
    def __new__(cls, arg=0.0):
        return float.__new__(cls, arg*0.0254)

标签: Python

添加新评论