如何实现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
相关产品推荐
相关产品推荐

