python - 为 3 维向量创建一个类
问题描述
我想在 python 中为一个三维向量创建一个类 Vector3D。我希望能够使用 pytest 通过这个测试运行代码并让它“通过”。我对编程很陌生,所以我不确定从哪里开始。我只需要使用 上课__init__
吗?使用数组的一个例子是
class Vector3D:
def __init__(self, x, y, z):
self.data = np.array([x,y,z])
我可以通过 test_vector3d.py (如下所列)运行它并承认我已经“正确”地表示它(就像我在示例中没有做的那样)它会通过测试吗?
还是我必须定义向量的不同属性才能通过测试?例如,我是否必须在类中定义添加Vector3D
才能知道在test_addition
调用时要做什么test_vector3d.py
?
例子:
def addition(self, other):
x1, y1, z1 = self.vec
x2, y2, z2 = other.vec
return VectorList(x1+x2, y1+y2, z1+z2)
这是名为 的测试test_vector3d.py
。我希望能够输入:
pytest test_vector3d.py
进入命令提示符并让我的Vector3D
班级通过所有测试。
from vector3d import Vector3D
def test_constructor():
v = Vector3D(1, 2, 3)
assert type(v) == Vector3D
assert v.x == 1
assert v.y == 2
assert v.z == 3
def test_addition():
v1 = Vector3D(1,2,3)
v2 = Vector3D(5,7,3)
v3 = v1 + v2
assert v3.x == 6
assert v3.y == 9
assert v3.z == 6
def test_subtraction():
v1 = Vector3D(5,6,2)
v2 = Vector3D(2,5,10)
v3 = v1 - v2
assert v3.x == 3
assert v3.y == 1
assert v3.z == -8
def test_multiplication():
v1 = Vector3D(2,2,2)
v2 = Vector3D(4,2,1)
v3 = v1 * v2
assert v3.x == 8
assert v3.y == 4
assert v3.z == 2
def test_equality():
v1 = Vector3D(1,2,3)
v2 = Vector3D(1,2,3)
assert v1 == v2
def test_string():
v1 = Vector3D(1,2,3)
assert str(v1) == "[1,2,3]"
def test_repr():
v1 = Vector3D(1,2,3)
assert repr(v1) == "Vector3D(1,2,3)"
def test_length():
v1 = Vector3D(10,0,0)
assert v1.length() == 10
v2 = Vector3D(2,2,2)
# Tolerance used due to floating point
assert v2.length() > 3.46 and v2.length() < 3.47
def test_dot():
v1 = Vector3D(3,2,5)
v2 = Vector3D(7,2,1)
dot = v1.dot(v2)
assert dot == 30
def test_cross():
v1 = Vector3D(1,2,3)
v2 = Vector3D(5,4,3)
v3 = v1.cross(v2)
assert v3.x == -6
assert v3.y == 12
assert v3.z == -6
解决方案
请查看以下 Python 教程:
它的 TLDR 是您将从一个类定义开始,例如
class Vector3D(object):
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
您需要定义额外的方法来将向量相加,以及执行任何其他操作或检查。
我更喜欢“unittest”包而不是您似乎正在使用的基本测试框架,但这需要对您所展示的内容进行一些编辑。如果您使用 pytest 而不是 unittest,那很好 - 但了解一些测试框架在后台执行的操作仍然很有用。
要在 unittest 下运行测试,您可能需要根据您显示的内容对其进行一些编辑,import unittest
在顶部添加和
if __name__ == '__main__':
unittest.main()
然后可以从命令行完成调用,例如python -m unittest test
.
推荐阅读
- mfc - 为什么 MFC Ado 应用程序不能在另一台计算机上运行?
- perl - 将匿名哈希插入匿名哈希以循环计数
- docker - 使用 docker compose 抑制 docker 网络以实现测试执行隔离
- javascript - 为什么我的过滤器没有按预期工作?
- javascript - 失败的道具类型:提供给“路线”的“对象”类型的无效道具“组件”,预期的“功能”
- javascript - NODEJS如何阻止在网络浏览器上发送socket.emit?
- javascript - 使用 new Date().getTimezoneOffset() 将 java 日历日期转换为 javascript 日期
- mysql - 使用 Spring Boot 的 Mysql 的 Hikari 配置
- dynamics-ax-2012 - AX 2012 中的补丁 DLL
- excel - VBA-excel中的正确数字格式