首页 > 解决方案 > 为 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

标签: pythonclassvectorpytest

解决方案


请查看以下 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.


推荐阅读