借鉴其他人的介绍,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,简简单单实例化。