python - 限制列表元素的类型

标签 python

我是 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): 

但是没有别的办法吗?

最佳答案

在 Python 中——你应该举止得体,不要做没有意义的事情。这是为教学和科学家设计的语言的灵 active 的一部分,并且不会过分强调类型或“对象契约”和其他类似的内容。

通过去除所有“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)

关于python - 限制列表元素的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27620231/

相关文章:

python - 如何使命令行参数对 Flask 路由可见?

python - Pymongo 在子文档中通过 _id 查找

python - 使用 Anaconda 安装本地包

python - 用总和替换 NumPy 数组和单个数字字典中的值

python - 创建 Rsync GUI 以备份到远程服务器

python - 从 C 导入标准 Python 库

python - 帮助使用 py2app 从 python 构建 mac 应用程序?

python - Mac 上的不同 Python 安装

python - 如何在 Mac OS Sierra 上使用 Virtualenv 安装 PyGreSQL

python - 转置数据框中的子集列(不是 groupby,需要创建新列)