2016-10-28 4 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を「知っている」し、初期化時に名前がかかります。これを変更して、必要な動物を必要なものにすることができます。同じクラスの中で条件を使うよりも簡単で直感的です。

関連する問題