我目前正在研究二维几何。我创建了两个类:Point和LineSegment:
class Point:
def __init__(self, x: float, y: float):
self.x = x
self.y = y
class LineSegment:
def __init__(self, p1: Point, p2: Point):
self.p1 = p1
self.p2 = p2
Run Code Online (Sandbox Code Playgroud)
一个有趣的情况是LineSegment(p1, p1)- 因此长度为零的线段。本质上,这就是重点p1。但它是类型LineSegment。
我可能会使用类似以下的方法来处理这种情况:
class LineSegment:
def __init__(self, p1: Point, p2: Point):
self.p1 = p1
self.p2 = p2
def simplify(self):
if self.p1 == self.p2:
return self.p1
return self
Run Code Online (Sandbox Code Playgroud)
尽管这可能是一个非常糟糕的主意,但我仍然很好奇:是否可以使类的构造函数LineSegment返回类的对象Point?
是的,虽然不是构造函数__init__(),而是实例化器__new__()。
class LineSegment:\n def __new__(cls, p1: Point, p2: Point):\n # Using "is" here since Points are mutable, but that\'s just personal preference\n if p1 is p2:\n return p1\n return super().__new__(cls)\n\n def __init__(self, p1: Point, p2: Point):\n self.p1 = p1\n self.p2 = p2\n\na = Point(0, 0)\nb = Point(1, 1)\nprint(LineSegment(a, b)) # <__main__.LineSegment object at ...>\nprint(LineSegment(a, a)) # <__main__.Point object at ...>\nRun Code Online (Sandbox Code Playgroud)\n\n注意,来自文档
\n\n\n\n如果不返回cls
\n__new__()的实例,则不会调用new instance\xe2\x80\x99s方法。__init__()