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