【问题标题】:How do I specify a how a python class is called by another python class?如何指定另一个 python 类如何调用 python 类?
【发布时间】:2022-11-13 01:35:46
【问题描述】:

我有两个类,例如,我将它们称为“点”和“向量”(就像在数学中一样)。我希望另一个类调用其中一个类来“转换”例如一个点到相应的向量((1,2,1)->(1,2,1)T)。

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


class Point:
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.coordinates = args
    
    def Vector(self):
        return Vector(*self.coordinates)


class Vector:
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.components = args

    def Point(self):
        return Point(*self.components)

现在,例如调用以下命令:

point1 = Point(1,2,3,4)
vector1 = Vector(point1)

我刚刚到达 ValueError

ValueError: non-numeral values are not supported

当给定的值不是 int、float 或 complex 时,正如预期的那样。我明白为什么会出现这个问题;类 Vector 被调用而不是类 Point 中的函数 Vector 并且由于类对象不是 int、float 或复杂的......通常我只是用

point1.Point()

但我不想用它来解决这个问题。我想让这在视觉上尽可能简单,而不需要进一步指定 args 类型转换在里面().任何人都知道如何实现这一目标?

【问题讨论】:

  • 您遇到了名称冲突(名称重复,请尝试重命名函数:def to_vector
  • 请用您的真实代码更新您的问题。我得到:SyntaxError: invalid syntaxdef Vector:
  • 没有实际的碰撞,但VectorPoint.Vector 是两个不同的东西。

标签: python class


【解决方案1】:

虽然您可以检查 Vector.__init__ 的参数以查看是否有多个数字或单个 Point,但最好使用班级Point 分解为可以传递给__init__ 的值的方法。

class Vector:
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.components = args

    def to_point(self):
        return Point(*self.components)

    @classmethod
    def from_point(cls, p: Point):
        return cls(*p.components)

point1 = Point(1,2,3,4)
vector1 = Vector.from_point(point1)

同样的论点适用于您的 Point 类:

class Point:
    def __init__(self, *args):
        if not argsintfloat(args):
            raise ValueError("non-numeral values are not supported")
        self.coordinates = args
    
    def to_vector(self):
        return Vector(*self.coordinates)

    @classmethod
    def from_vector(cls, v: Vector):
        return cls(*v.components)

在数学术语中,VectorPoint同构,这意味着您可以无损地从一种类型的值转换为另一种类型的值。具体来说,如果你有一个Pointp,那么p == Point.from_vector(p.to_vector()),如果你有一个Vectorv,那么v == Vector.from_point(v.to_point())

【讨论】:

  • 好的,所以您是在暗示我正在尝试做的事情实际上不可能并且按照您所写的那样完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 2015-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 2015-12-19
相关资源
最近更新 更多