Python类和子类

时间:2017-05-12 16:40:03

标签: python oop

我正在尝试为我的矢量制作一个通用类,其操作和方法适用于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>

0 个答案:

没有答案