2016-09-05 3 views
1

私はいくつかの入力データに応じてサブクラスのオブジェクトを返すことになっているメソッドを記述しようとしています。どのように一致するサブクラスのオブジェクトを返すのですか?

Pet.parse(["big", "woof"]) 
> returns object of class Dog 

Pet.parse(["small", "maw"]) 
> returns object of class Cat 

Pet.parse(["small", "blup"]) 
> returns object of class SmallPet 

私は適切な方法でこれを記述する方法の見当がつかない:私は

class Pet(): 
    @classmethod 
    def parse(cls,data): 
     #return Pet() if all else fails 
     pass 

class BigPet(Pet): 
    size = "big" 

    @classmethod 
    def parse(cls,data): 
     #return BigPet() if all subclass parsers fails 
     pass   

class SmallPet(Pet): 
    size = "small" 

    @classmethod 
    def parse(cls,data): 
     #return SmallPet() if all subclass parsers fails 
     pass 

class Cat(SmallPet): 
    sound = "maw" 

    @classmethod 
    def parse(cls,data): 
     #return Cat() if all criteria met 
     pass 

class Dog(BigPet): 
    sound = "woof" 

    @classmethod 
    def parse(cls,data): 
     #return Dog() if all criteria met 
     pass 

は、私がこのような、「パーサ」を作りたいと想像して説明してみましょう。助言がありますか?もちろん、これは間違いの例です。私は、これを何らかの通信プロトコルの異なるパケットに適用したいと考えています。

私は完全に間違った方法でこれを近づいていた場合、私に教えてください:)

答えて

0

をなぜ、正確なクラス名を渡すglobals()で、そのために見て、それをインスタンス化しませんか?

def parse_pet(class_name, data): 
    # will raise a KeyError exception if class_name doesn't exist 
    cls = globals()[class_name] 
    return cls(data) 

cat = parse_pet('Cat', 'meow') 
big_pet = parse_pet('BigPet', 'woof') 
+0

私も書くことができるので: 猫=キャット(引数) big_pet = BigPet(引数) 私はそのすべてに同じオーバーライドされた関数を呼び出すいくつかのルートクラスでクラスメソッドを探しています子どもたちはそこでより良い一致が見られるかどうかを知る。 – chrisvp

+0

反対提案では、文字列とクラスの間に非常に大きく、開発者が管理しているマップが必要であり、2番目の提案には明らかな根拠や利点がないようです。ほとんどのシリアライザは文字列をクラス名または型に直接マッピングします。 – Soviut

+0

おそらく、あなたの提案では紙に地図を残し、手動で各パケットを検査し、好きなタイプのオブジェクトを返すことを提案します。別の方法があるはずです – chrisvp

関連する問題