Python类和子类

2024-10-04 11:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的向量创建一个通用类,其中的操作和方法同时适用于2D和3D。我有以下代码:

class Vector:
    class _2D:
        def __init__(self, x, y):
            self.x = float(x)
            self.y = float(y)

        def addNormal(self, normal):
            self.normal = normal

        def __str__(self):
            return '<%s, %s>' % (self.x, self.y)

    class _3D:
        def __init__(self, x, y, z):
            self.x = float(x)
            self.y = float(y)
            self.z = float(z)

        def __str__(self):
            return '<%s, %s, %s>' % (self.x, self.y, self.z)

我使用的__str__方法如下:

a = Vector._2D(1, 2)
print str(a) # <1.0, 2.0>
b = Vector._3D(1, 2, 3)
print str(b) # <1.0, 2.0, 3.0>

事实上,我找不到(目前)一种方法来实现这一点,所以我可以这样做:

class Vector:
    def __str__(self):
        try:
            return '<%s, %s, %s>' % (self.x, self.y, self.z)
        except AttributeError:
            return '<%s, %s>' % (self.x, self.y)

    class _2D:
        def __init__(self, x, y):
            self.x = float(x)
            self.y = float(y)

        def addNormal(self, normal):
            self.normal = normal

    class _3D:
        def __init__(self, x, y, z):
            self.x = float(x)
            self.y = float(y)
            self.z = float(z)

我想这是正确的方法,这样代码就更清晰了,而且不受冗余的影响。 我这样做的“原因”似乎并不明显,但我有很多方法,比如__add____sub__,可以使向量上的操作更容易。尤其是在我学习3D的时候

当我读到嵌套类在python中不是很好时,我非常愿意就如何做不同的事情提出建议,但我坚持认为 保持稍微相同,好像:

class _3D:
    def __init__(self, x, y, z):
        self.x = float(x)
        self.y = float(y)
        self.z = float(z)

    def __str__(self):
        return '<%s, %s, %s>' % (self.x, self.y, self.z)

    def __add__(self, operand):
        return _3D(self.x + operand.x, self.y + operand.y, self.z + operand.z)

    a = _3D(1, 2, 3)
    b = _3D(4, 5, 6)
    print a + b # <5.0, 7.0, 9.0>

Tags: 方法代码selfreturninitdeffloat向量