2014-12-23 2 views
1

Я новичок в 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 

Теперь это работает хорошо, но, как я uncoment линии снизу у меня будет несколько ошибок во время выполнения, как я вызываю метод ToString() для объекта типа ул. И вот вопрос. Как я могу предотвратить вставку такого объекта разного типа, кроме Movie, в colection? Парень Java у меня бы этот список выдержанные так:

List<Movie> 

Кроме того, я мог бы поставить условие там add_movie функции, как это:

if isinstance(movie, Movie): 

но не есть ли другой способ?

+3

Вот совет: не пишите Java в Python. –

+3

Нет, другого пути нет. Python относится к разработчикам как к соглашающимся взрослым, если кто-то хочет быть настолько глупым, чтобы вставить строковый объект и сломать все, тогда от них не следует этого мешать. –

+0

Вам не нужен конкретный класс коллекции фильмов, потому что список является общим, и вы можете сбрасывать что-либо в нем. –

ответ

1

В 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) 
+0

Спасибо за ваш ответ. –

2

В Python мировой Java иногда ласково называют «кабалу» языка. Существуют две принципиально разные философии языка программирования: одна группа пытается усложнить работу с плохими программами (Java), а другая стремится упростить работу с хорошими программами (Python). Ни один из них не является полностью успешным, потому что можно писать плохие программы на любом языке.

В целом, в Python мы предпочитаем писать наш код, чтобы добавить в список только Movie объектов, а не тратить время, чтобы убедиться, что каждый элемент, помещенный в список, равен Movie. Единичные тесты могут использоваться для проверки этого в заданном числе случаев, но это никогда не даст вам уверенности, которую вы ищете.

Тип проверки природы, которую вы предлагаете, возможен, но в целом считается ненужным или даже «unPythonic».

Смежные вопросы