你的教练好运气似乎并没有“说话的Python作为母语”。 ;)整个课程的概念非常愚蠢;真正的Python程序员只是直接使用内置的序列类型。但是,然后,这种事情是正常的学术演习,可悲...
向Vector类添加构造函数。
在Python中,常见的“这是你如何创建一个新的对象,说什么这是一个实例”的东西是默认内部处理,然后将婴儿对象传递给类初始化方法通过设置类的新实例应该具有的属性,使其成为“适当的”实例。我们称之为方法__init__
。
的构造应该采取一个参数。如果此参数是int或long或从其中一个派生的类的实例
这是通过使用内建函数isinstance
进行测试的。您可以在文档中查找自己(或者在REPL尝试help(isinstance)
)。
在这种情况下,构造指定长度的Vector,每个元素初始化为0.0。
在我们的__init__
中,我们通常只指定属性的起始值。 __init__
的第一个参数是我们初始化的新对象,我们通常称其为“自我”,以便人们了解我们正在做的事情。其余的参数是调用者请求实例时传递的内容。在我们的案例中,我们总是期待一个参数。它可能有不同的类型和不同的含义,所以我们应该给它一个通用名称。
当我们检测到泛型参数是isinstance
的整数类型时,我们通过设置适当的数据来“构造”向量。我们只分配到的self
一些属性(称之为无论是有道理的),和值将被......嗯,你有什么打算用来内部表示矢量的数据?希望你已经想过了:)
如果长度为负值,请用适当的消息引发ValueError。
哦,好点...我们应该在我们尝试构建存储之前检查一下。一些显而易见的方法可以基本上将负数视为零。其他方式可能会引发我们无法控制的异常情况。
如果参数不被认为是长度,那么如果参数是一个序列(例如列表),则使用具有给定序列的长度和值的向量进行初始化。
“序列”是一个非常模糊的概念;列表和元组以及什么 - 没有“序列”基类,所以我们不能用isinstance
来轻松检查。 (毕竟,有人可以很容易地发明一种我们没有想到的新的序列)。要检查,如果事情是一个序列的最简单的方法是尝试为它创建一个迭代器,具有内置iter
功能。如果这个东西不是可迭代的(尝试它!),这将会产生一个相当有意义的TypeError
,这样就可以很容易地处理错误 - 我们只是让它做它的事情。
假设我们有一个迭代器,我们可以轻松地创建我们的存储:大多数序列类型(我假设你有他们的一记已经和一个肯定是包括在内)将接受他们__init__
方法的迭代器并做复制序列数据的明显事情。
接下来执行__repr__
方法返回一个可用于初始化Vector的python代码的字符串。这串代码应该由类名后面跟着一个开括号,然后是表示为列表的内容,然后是一个右括号。“
希望这是不言自明的。提示:你应该可以通过使用存储属性自己的__repr__
来简化这个问题,也可以考虑使用字符串格式将字符串放在一起
可能的重复[什么是最好的(惯用的)方法来检查一个Python变量的类型?](http://stackoverflow.com/questions/378927/what-is-the-best-idiomatic-way-来检查这种类型的python变量) –