我正在尝试编写一个方法,该方法应该根据某些输入数据返回子类的对象。让我试着解释
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
想象一下,我想制作一个“解析器”,例如:
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
我不知道如何以正确的方式写这个。有什么建议?当然这是一个废话的例子。我想将它应用于某种通信协议的不同数据包。
如果我以完全错误的方式接近这个,请告诉我:)
答案 0 :(得分: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')