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
は、私がこのような、「パーサ」を作りたいと想像して説明してみましょう。助言がありますか?もちろん、これは間違いの例です。私は、これを何らかの通信プロトコルの異なるパケットに適用したいと考えています。
私は完全に間違った方法でこれを近づいていた場合、私に教えてください:)
私も書くことができるので: 猫=キャット(引数) big_pet = BigPet(引数) 私はそのすべてに同じオーバーライドされた関数を呼び出すいくつかのルートクラスでクラスメソッドを探しています子どもたちはそこでより良い一致が見られるかどうかを知る。 – chrisvp
反対提案では、文字列とクラスの間に非常に大きく、開発者が管理しているマップが必要であり、2番目の提案には明らかな根拠や利点がないようです。ほとんどのシリアライザは文字列をクラス名または型に直接マッピングします。 – Soviut
おそらく、あなたの提案では紙に地図を残し、手動で各パケットを検査し、好きなタイプのオブジェクトを返すことを提案します。別の方法があるはずです – chrisvp