You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Python中Point与Vector类的直接互转调用?

实现Point与Vector类的直接转换

可以通过重写类的__new__方法来实现需求,既不需要显式调用转换方法,也不用修改__init__的原有参数校验逻辑。__new__是Python创建类实例时最先执行的方法,我们可以在这里拦截并处理参数类型,将另一个类的实例转换为当前类所需的数值参数。

修改后的完整代码如下:

argsintfloat = lambda l: all(isinstance(i, (int, float, complex)) for i in l)


class Point:
    def __new__(cls, *args):
        # 处理从Vector实例转换的情况
        if len(args) == 1 and isinstance(args[0], Vector):
            return cls(*args[0].components)
        return super().__new__(cls)
    
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.coordinates = args


class Vector:
    def __new__(cls, *args):
        # 处理从Point实例转换的情况
        if len(args) == 1 and isinstance(args[0], Point):
            return cls(*args[0].coordinates)
        return super().__new__(cls)
    
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.components = args

测试验证

执行以下代码即可完成直观的类间转换:

point1 = Point(1,2,3,4)
vector1 = Vector(point1)
print(vector1.components)  # 输出: (1, 2, 3, 4)

vector2 = Vector(5,6,7)
point2 = Point(vector2)
print(point2.coordinates)  # 输出: (5, 6, 7)

原理说明

  • __new__方法在实例创建前执行,负责返回实例对象。我们在这里判断传入的参数是否为单个的目标类实例,若是则提取其内部的坐标/分量,再调用当前类创建实例。
  • 后续执行__init__时,接收到的仍然是纯数值参数,完全保留了原有参数校验逻辑,无需在__init__中额外处理类型判断。

内容的提问来源于stack exchange,提问作者elai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 08:15:43