关于类:python中的向量Vector

Vector in python

我正在这个项目中处理Python中的向量。但我对python不太熟悉,不知道如何破解它。说明如下:

"向Vector类添加一个构造函数。构造函数应采用单个参数。如果此参数是int或long或从其中一个派生的类的实例,则将此参数视为向量实例的长度。在这种情况下,构造指定长度的向量,并将每个元素初始化为0.0。如果长度为负,则发出一条带有适当消息的ValueError。如果参数不被认为是长度,那么如果参数是序列(例如列表),那么用向量初始化给定序列的长度和值。如果参数未用作向量的长度,并且不是序列,则使用适当的消息引发typeerror。

接下来,实现__repr__方法以返回一个字符串python代码,该字符串可用于初始化向量。这个代码字符串应该由类的名称后面跟一个左括号,后面跟一个向量的内容,表示为一个列表,后面跟一个右括号。"

我不知道如何进行类类型检查,也不知道如何根据给定的对象初始化向量。有人能帮我吗?谢谢!


你的老师似乎不"把Python说成一种母语"。;)类的整个概念非常愚蠢;真正的Python程序员直接使用内置序列类型。但是,这种事情对于学术练习来说是正常的,可悲的是…

Add a constructor to the Vector class.

在python中,常见的"这是创建一个新对象的方法,并说明它是什么"的实例,默认情况下,在内部处理,然后通过设置类的新实例应该具有的属性,将子对象传递给类的初始化方法,使其成为一个"合适"的实例。我们称之为方法__init__

The constructor should take a single argument. If this argument is either an int or a long or an instance of a class derived from one of these

这是通过使用内置函数isinstance进行测试的。您可以在文档中自己查找(或者在repl上尝试help(isinstance))。

In this case, construct a Vector of the specified length with each element is initialized to 0.0.

在我们的__init__中,我们通常只分配属性的起始值。__init__的第一个参数是我们正在初始化的新对象,我们通常称之为"self",以便人们理解我们正在做什么。其余的参数是调用方请求实例时传递的所有参数。在我们的例子中,我们总是只期望一个论点。它可能有不同的类型和不同的含义,所以我们应该给它一个通用名称。

当我们检测到泛型参数是带有isinstance的整数类型时,我们通过设置适当的数据来"构造"向量。我们只是给self的某个属性赋值(不管它有什么意义,都可以称之为它),这个值是……那么,你打算用什么来表示向量的内部数据呢?希望你已经考虑过了:)

If the length is negative, raise a ValueError with an appropriate message.

哦,说得对……在建造仓库之前,我们应该检查一下。一些显而易见的方法基本上会将负数视为零。其他方法可能会引发一个我们无法控制的例外。

If the argument is not considered to be the length, then if the argument is a sequence (such as a list), then initialize with vector with the length and values of the given sequence.

"sequence"是一个更加模糊的概念;列表和元组以及没有"sequence"基类的东西,所以我们不能用isinstance轻松地检查它。(毕竟,有人可以很容易地发明一种我们没有想到的新序列)。检查某个序列是否是序列的最简单方法是使用内置的iter函数为其创建迭代器。如果事情无法解决(试试看),这就已经产生了一个相当有意义的TypeError。这样就可以很容易地处理错误了——我们只是让它自己去做。

假设我们有一个迭代器,我们可以轻松地创建我们的存储:大多数序列类型(我假设您已经考虑了其中一个类型,并且该类型肯定包括在内)将接受其__init__方法的迭代器,并执行复制序列数据的明显操作。

Next implement the __repr__ method to return a string of python code which could be used to initialize the Vector. This string of code should consist of the name of the class followed by an open parenthesis followed by the contents of the vector represented as a list followed by a close parenthesis."

希望这是不言自明的。提示:您应该能够通过使用存储属性自己的__repr__来简化这一过程。还可以考虑使用字符串格式将字符串放在一起。


根据作业的不同,这可能是合适的,也可能是不合适的,但是在Python编程中,显式检查参数的类型并基于此更改行为并不常见。只是尝试使用您期望的特性是更正常的(如果需要返回到其他选项,可能会捕获异常)。

在这个特定的例子中,一个普通的python程序员实现了一个需要这样工作的向量,他会尝试使用这个参数,就像它是一个整数/长(提示:如果用一个整数乘以一个列表会发生什么?)要初始化向量,如果它抛出异常,请尝试使用它,就像它是一个序列一样,如果它也失败了,那么您可以抛出一个TypeError

这样做的原因是,它使您的类可以使用其他对象类型,这些对象类型不是整数或序列,而是像它们那样工作的。特别是,很难全面检查某个东西是否是"序列",因为可以用作序列的用户定义类不必是任何可以检查的公共类型的实例。例如,Vector类本身就是用来初始化向量的很好的候选者!

但我不确定这是否是你老师期望的答案。如果您还没有了解异常处理,那么您几乎肯定不会使用这种方法,所以请忽略我的帖子。祝你学习顺利!


您可以使用isInstance进行类型检查。

用一个初始化方法完成的类初始化。

祝你的任务好运:-)


关于如何在stackoverflow上检查python中的类型,有很多例子(请参阅我的注释了解最高级的一个)。

要初始化类,请使用__init__方法:

1
2
3
class Vector(object):
    def __init__(self, sequence):
        self._internal_list = list(sequence)

现在您可以拨打:

1
my_vector = Vector([1, 2, 3])

Vector中的其他函数中,您可以参考self._internal_list。我把_放在变量名之前,以表明它不应该从类外部更改。

list功能的文档可能对您有用。


您需要开始的一切都在这里:http://docs.python.org/library/functions.html网站