gpt4 book ai didi

Python 断言 isinstance() 向量

转载 作者:行者123 更新时间:2023-12-05 00:48:59 29 4
gpt4 key购买 nike

我正在尝试在 python 中实现 Vector3 类。如果我用 c++ 或 c# 编写 Vector3 类,我会将 X、Y 和 Z 成员存储为 float ,但在 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)

你会在这些情况下使用断言吗?根据这个网站:https://wiki.python.org/moin/UsingAssertionsEffectively它不应该被过度使用,但对于我作为一个一直使用静态类型的人来说,不检查相同的数据类型是非常奇怪的。

最佳答案

assert 比在生产代码中闲逛更适合用于调试。您可以改为为矢量属性 xyz 以及 raise ValueError< 创建属性/strong> 当传递的值不是所需的类型时:

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

@x.setter
def x(self, val):
if not isinstance(val, (int, float)):
raise TypeError('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)))
...

关于Python 断言 isinstance() 向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47268107/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com