总之,我有一个Django模型,我希望实例根据其中一个字段的值具有不同的行为:
ANIMAL_TYPES = ('cow', 'african swallow', 'dog')
ANIMAL_TYPE_CHOICES = tuple(enumerate(ANIMALS, start=1))
class Animal(models.Model):
animal_type = models.PositiveIntegerField(choices=ANIMAL_TYPE_CHOICES)
# ... other model fields
def speak_cow(self):
return 'moo'
def speak_african_swallow(self):
return 'squawk'
def speak_dog(self):
return 'woof'
choose_speak = {i: getattr(Animal,'speak_{}'.format(
name.replace(' ', '_'))) for (i, name) in ANIMAL_TYPE_CHOICES}
def speak(self):
return Animal.speak[self.animal_type](self)
目标是能够在Animal
的实例上调用speak()
,并让类选择正确的speak
方法。(需要说明的是:speak
方法不仅仅返回一个字符串。)
这不起作用:Animal
在我对choose_speak
的词典理解中使用它时没有定义。目前,我的工作是使用
choose_speak = [None, speak_cow, speak_african_swallow, speak_dog]
但是有没有一种方法可以自动生成我想要的,这样我就不必手动添加任何我定义的新方法(例如speak_sheep
)?你知道吗
你也可以定义一个包含所有动物声音的列表。。。i、 e
这样你就不用定义新方法了。 用它来说话,比如:
编辑:
正是出于这个原因,我花了一点时间,用纯python编写了这段代码,这段代码可能与您想要的非常接近:
注意:重写模型的
__init__
不是Django的最佳实践,如here所示:你需要的是
getattr
:但如果我是你,我现在只会在
speak
中使用if ... else
,因为它更简单、更明确。你知道吗相关问题 更多 >
编程相关推荐