我正在尝试在python中实现Vector3类。如果我用c ++或c#编写Vector3类,我会将X,Y和Z成员存储为浮点数,但是在python中我读到了鸭子游戏的方法。所以根据我的c ++ / c#知识我写了这样的东西:
class Vector3:
def __init__(self, x=0.0, y=0.0, z=0.0):
assert (isinstance(x, float) or isinstance(x, int)) and (isinstance(y, float) or isinstance(y, int)) and \
(isinstance(z, float) or isinstance(z, int))
self.x = float(x)
self.y = float(y)
self.z = float(z)
关于断言语句的问题是:在此实例中是否使用它们(用于数学的Vector3实现)。我也用它来做像
这样的操作def __add__(self, other):
assert isinstance(other, Vector3)
return Vector3(self.x + other.x, self.y + other.y, self.z + other.z)
你会在这些情况下使用assert吗? 根据这个网站:https://wiki.python.org/moin/UsingAssertionsEffectively它不应该被过度使用,但对于我来说,一直使用静态类型的人,不检查相同的数据类型是非常奇怪的。
答案 0 :(得分:3)
assert
更适合用于调试,而不是在生产代码中闲逛。当传递的值不是所需类型时,您可以为矢量属性x
,y
和z
以及 raise ValueError
创建属性:
class Vector3:
def __init__(self, x=0.0, y=0.0, z=0.0):
self.x = x
self.y = y
self.z = z
@property
def x(self):
return self._x
@setter.x
def x(self, val):
if not isinstance(val, (int, float)):
raise ValueError('Inappropriate type: {} for x whereas a float \
or int is expected'.format(type(val)))
self._x = float(val)
...
注意isinstance
如何获取类型元组。
在__add__
运算符中,您需要raise TypeError
,还包括相应的消息:
def __add__(self, other):
if not isinstance(other, Vector3):
raise TypeError('Object of type Vector3 expected, \
however type {} was passed'.format(type(other)))
...