Skip to main content
 首页 » 编程设计

Python多态对象调用基类方法而不是子类方法

2025年05月04日9虾米哥

我在 Django 中有以下模型。我有理由不让 Animal 成为抽象基类。

class Animal(models.Model): 
    sound = "none" 
    def ClassType(self): 
        return 'animal' 
 
class Cat(Animal): 
    animal_id = models.OneToOneField(Animal,parent_link=True) 
    sound = "meow" 
    def ClassType(self): 
        return 'cat' 
 
class Dog(Animal): 
    animal_id = models.OneToOneField(Animal,parent_link=True) 
    sound = "bow" 
    def ClassType(self): 
        return 'dog' 

我查询一组动物作为

query = Animal.objects.all()

结果是一个必须只有狗和猫的列表。但是,在调用

查询[0].ClassType

我只得到动物。 “查询”中的所有对象都给我 animal,而我想根据实例获取 dog 或 cat。我在 Python 多态世界中有什么不理解的,我该如何解决?

请您参考如下方法:

您可以使用点符号(如属性)访问狗和猫对象。查询 Animal.objects.all() 将返回所有动物,其中包括所有猫和狗。

qs = Animal.objects.all() 
for animal in qs: 
    try: 
        obj = animal.cat 
        # its a cat 
    except AttrbuteError: 
        # its a dog 
        obj = animal.dog 

如您所见,在识别哪一只是狗和哪一只是猫时存在一个小故障,一个好的方法是在您的动物模型中设置一个临时属性:

class Animal(models.Model): 
    sound = "none" 
 
    def is_cat(self): 
        if not hasattr(self, '_is_cat'): 
            self._is_cat = Cat.objects.filter(animal_id=self).exists() 
        return self._is_cat 

现在你可以简单地做:

qs = Animal.objects.all() 
for animal in qs: 
    if animal.is_cat(): 
        # this is a cat 
    else: 
        # dog