2016-10-28 3 views
0

У меня есть куча классов, каждый из которых имеет один аргумент __init__, а затем возвращают некоторые данные, например,классы, такие как словари, бесконечные списки

class Animal(object): 
    def __init__(self, name): 
     if name == 'lion': 
      self.sound = 'roar' 
     elif name == 'human': 
      self.sound = 'burp' 
     else: 
      raise ValueError('Unknown animal') 

class Passenger(object): 
    def __init__(self, index): 
     self.sound = 'I\'m passenger number %d.' % index 

Некоторые из этих классов, по существу, списки и словари (например, Animal), некоторые из них «открытые» (например, Prime). После создания экземпляра любого из классов они используются в другом месте, поэтому приятно, что вы можете создавать их так же (Something(arg)).

Что такое не приятно, хотя факт, что, как пользователь, я не знаю, какие из них действительны, не глядя на код. Что-то вроде

animals = { 
    'lion': {'sound': 'roar'}, 
    'human': {'sound': 'burp'}, 
    } 

бы решить эту проблему, но Passenger не подходит здесь.

Есть ли шаблон дизайна, который подходит для обоих случаев?

+0

Вы можете сделать этот словарь переменной класса. Реальный объектно-ориентированный подход состоит в том, чтобы «Lion» и «Human» были классами, которые расширяют «Animal» –

ответ

0
class Animal(object): 
    def __init__(self, name): 
     self.name = name 
    def some_thing_all_animals_do(self): 
     print('do stuff') 

class Passenger(Animal): 
    def stuff_only_passengers_do(self): 
     print('more stuff') 

class Lion(Animal): 
    def stuff_only_lions_do(self): 
     print('lion stuff') 

Таким образом, оба пассажира и львы будут «знать» метод some_thing_all_animals_do и взять имя инициализации. Вы можете изменить это, чтобы делать все, что вам нужно, для любых животных, которые вам нужны, и это делает его намного проще и интуитивно понятным, чем использование условных выражений внутри одного класса.

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