python代码中 __new__ ()和 __init__()之间的关联,以及super的关系

借鉴其他人的介绍,new的优先级高于init,new的作用是创建类对象,init作用是将这个对象实例化。

new()是在新式类中新出现的方法,它作用在构造方法建造实例之前。
可以这样理解:Python中存在于类中的构造方法__init__()负责将类实例化,而在__init__()执行之前,new()负责制造这样的一个实例对象,以便__init__()去让该实例对象更加的丰富(为其添加属性等)。
同时:new() 方法还决定是否要使用该__init__() 方法,因为__new__()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。

例子如下:

from sympy.geometry import  Point as SPPoint,  Line2D as SPLine2D
class Line(SPLine2D):
    def __new__(cls, points):
        p1 = SPPoint(points[0][0], points[0][1])
        p2 = SPPoint(points[-1][0], points[-1][1])
        return super(Line, cls).__new__(cls,  p1, p2)
    def prin(self):
        return self.p1.distance(self.p2)

pint = [[0, 1], [3, 4]]
res = Line(pint)
print(float(res.prin()))

同样__init__也可以直接继承其他爸爸的属性

from shapely.geometry import LineString 
class Line(LineString):
    # 线串类,父类是shapely的LineString
    def __init__(self, points):
        super(Line, self).__init__(coordinates=points)
    def prin(self):
        return self.length

pint = [[0, 1], [3, 4]]
res = Line(pint)
res.prin()
print(res.prin())

其中new要注意return一下自己的类,继承对象的入参在return中的new后面体现,但是super内容是自己,这样可以实例化。

new的这个return过程其实包含了其他类里面的init,所以实例化是不可或缺的。

而init继承的时候直接supper其他的类,不用提及自己,也不用return,简简单单实例化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值