2011-11-24 47 views
0

我正在处理这个处理python中的向量的项目。但我是python的新手,并不知道如何破解它。这里的指令是:python中的向量

“向Vector类添加一个构造函数,构造函数应该只带一个参数,如果这个参数是一个int类型,或者是一个long类型的实例,参数是Vector实例的长度,在这种情况下,构造一个具有指定长度的Vector,每个元素的初始值为0.0,如果长度为负值,则使用适当的消息引发ValueError;如果不考虑参数是长度,那么如果参数是一个序列(例如一个列表),那么使用给定序列的长度和值向量初始化。如果参数不被用作向量的长度,并且如果它不是然后用适当的消息引发TypeError。

接下来实现__repr__方法返回可用于初始化Vector的python代码的字符串。这段代码应该由类名后面跟着一个开括号,后面跟着一个列表,然后是一个右括号表示向量的内容。“

我不知道如何做类类型。?!检查,以及如何根据给定的对象初始化向量可能有人请帮助我谢谢你需要开始

+0

可能的重复[什么是最好的(惯用的)方法来检查一个Python变量的类型?](http://stackoverflow.com/questions/378927/what-is-the-best-idiomatic-way-来检查这种类型的python变量) –

回答

0

有许多例子如何在StackOverflow中检查Python中的类型(请参阅我的评论以获得最高评分)

初始化类,使用__init__方法:

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

现在,您可以拨打:

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

等功能里面,你可以参考self._internal_list。我在变量名之前加上了_,以表明它不应该从课外改变。

documentation for the list function可能对您有用。

+0

感谢您的快速回复!它适用于序列,但是当参数是一个int或一个long(如Vector(3))时,怎么样?那么结果应该是Vector([0.0,0.0,0.0])? – pew007

+0

@ pew007 - 看看我添加的链接,作为评论如何区分不同的类型。 –

+0

我修好了!谢谢! – pew007

0

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

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

与分配:-)

2

你的教练好运气似乎并没有“说话的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__来简化这个问题,也可以考虑使用字符串格式将字符串放在一起

+0

-1请停止传播这个Python没有构造函数的错误信息,或者'__new__'是一个错误信息。当你在Python中调用'SomeClass(s​​ome,args)'时,系统神奇地创建一个'空白'对象,然后'SomeClass'的'__init__'方法得到控制来填充空白对象。这完全是**构造函数如何在Java/C++中工作;该对象在构造函数代码获得控制权时已存在,由系统提供。 '__init__'的官方Python文档甚至在此将其引用为构造函数:http://docs.python.org/reference/datamodel.html#basic-customization – Ben

+0

无法显式调用Java和C++中的构造函数。 Python的'__init__'可以(尽管你显然不应该)。定义是主观的,系统的确有不同的工作。Python中没有任何东西与C++初始化列表非常相似,或者Java为成员或实例初始化块设置了默认值。我不认为它是错误的信息,我发现你的指责相当有害。 –

+0

我并不是说我认为你做到了,或者你说的如此恶毒。但是这个想法是从某处开始的,大量非常聪明的经验丰富的Python程序员不断重复“__init__”不是构造函数,因为它不创建对象,只是初始化“,而没有真正考虑它。最重要的是,'__new__'是一个构造函数是荒谬的;它不像Java/C++构造函数。 – Ben

0

这可能也可能不合适,这取决于作业,但是在Python编程中它不是非常常见的是明确地检查一个参数的类型并根据它改变行为。只是尝试使用你期望它的特性更为正常(可能捕获异常f必须回退到其他选项)。

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

做这件事的原因是它让你的课程开放,以便与其他对象类型一起工作,后来人们提出的对象类型不是整数或序列,而是像他们一样工作。特别是,要全面检查某些东西是否是“序列”是非常困难的,因为可以用作序列的用户定义类不一定是您可以检查的任何常见类型的实例。例如,Vector类本身就非常适合用来初始化Vector。

但我不确定这是否是您的老师所期待的答案。如果您还没有学习异常处理,那么您几乎肯定不打算使用这种方法,所以请忽略我的文章。祝你好运!