首页 > 解决方案 > 覆盖 Python 的 __new__ 方法时复制原始行为

问题描述

说我有以下课程

class Point:
    def __init__(self, coords):
        self.coords = coords

class Line:
    def __init__(self, coords_A, coords_B):
        self.A = coords_A
        self.B = coords_B

我想Point在实例化 a 时得到 a Linewith coords_A == coords_B。我的理解是我可以通过覆盖来做到这一点__new__。这是我尝试过的:

class Line:
    def __new__(cls, coords_A, coords_B):
        if coords_A == coords_B:
            return Point(coords_A)
        return super().__new__(cls, coords_A, coords_B)
        
    def __init__(self, coords_A, coords_B):
        self.A = coords_A
        self.B = coords_B

但是,这不起作用(调用Line(1, 1)做我想要的,但Line(1, 2)引发 a TypeError)。也不应该,毕竟我不是很想调用__new__父类的方法,我只是想复制Line.__new__. 我该怎么做呢?

标签: pythonoverridingnew-operator

解决方案


这似乎有效:

class Point:
    def __init__(self, coords):
        self.coords = coords


class Line:
    def __new__(cls, coords_A, coords_B):
        if coords_A == coords_B:
            return Point(coords_A)
        return super(Line, cls).__new__(cls)

    def __init__(self, coords_A, coords_B):
        self.A = coords_A
        self.B = coords_B

推荐阅读