我是python的新手,但我对Java有一些了解。这里我有我的第一个python代码:
class Movie(object):
def __init__(self, name, year):
self.name = name
self.year = year
def tostring(self):
return "%s (%s)" % (self.name,self.year)
def __str__(self):
return self.tostring()
class MoviesCollection(object):
def __init__(self):
self.colection = []
def add_movie(self, movie):
self.colection.append(movie)
def __iter__(self):
return iter(self.colection)
def __str__(self):
return '\n'.join(map(str, self.colection))
filmy = MoviesCollection()
a = Movie('A', 256)
b = Movie('B', 512)
c = Movie('C', 1024)
filmy.add_movie(a)
filmy.add_movie(b)
filmy.add_movie(c)
filmy.add_movie(c)
filmy.add_movie(c)
filmy.add_movie(c)
#filmy.add_movie('Aloha')
for m in filmy:
print m.tostring()
print filmy
现在这很好用,但是当我从底部取消该行时,我将遇到一些运行时错误,因为我在str类型对象上调用了一个tostring()方法。这是问题所在。如何防止将类型不同于Movie的对象插入到集合中?我这里的Java人会像这样列出这个列表:
List<Movie>
此外,我可以在那里添加一个条件add_movie函数:
if isinstance(movie, Movie):
但是还有其他办法吗?
答案 0 :(得分:3)
在Python中 - 你应该表现得恰到好处,不做那些没有意义的事情。这是为教学和科学家设计的语言的灵活性的一部分,并没有过多地强调类型,或“对象契约”和其他类似的绒毛。
通过从中获取所有“Java”来编写代码的方式是:
class Movie(object):
""" A movie, thing to spend a few hours
watching, then a few hours hating yourself
over watching it. """
def __init__(self, name, year):
self.name = name
self.year = year
def __str__(self):
return '{} ({})'.format(self.name, self.year)
movie_collection = [Movie('Titanic', 1997), Movie('Showgirls', 1995)]
for movie in movie_collection:
print(movie)
答案 1 :(得分:3)
在Python世界中,Java有时被亲切地称为“束缚”语言。有两种根本不同的编程语言哲学:一组寻求使编写糟糕的程序(Java)变得更加困难,另一组则努力使编写好的程序(Python)变得更容易。两者都没有完全成功,因为可以用任何语言编写糟糕的程序。
总的来说,在Python中,我们更喜欢编写代码,以便只将Movie
个对象添加到列表中,而不是花时间验证列表中的每个元素都是Movie
。在给定数量的情况下,可以使用单元测试来验证这一点,但这绝不会为您提供所需的保证。
对你建议的性质进行类型检查是可能的,但通常认为是不必要的甚至是“unPythonic”。