如何从子类中获取抽象类名称

时间:2018-09-10 07:33:24

标签: python django django-models

我的型号如下,

class FooBarAbstract(models.Model):
    foobar = models.IntegerField()

    class Meta:
        abstract = True


class Foo(FooBarAbstract):
    foo = models.IntegerField()


class Bar(FooBarAbstract):
    bar = models.IntegerField()



如何通过使用子类(FooBarAbstractFoo)或它们的对象来获得抽象类名称(Bar)?

3 个答案:

答案 0 :(得分:2)

您可以从类的__bases__属性中获取类的基类的名称。

假设您的派生类始终仅继承一个类,则可以使用以下方法获取基类的名称:

class Foo(FooBarAbstract):
    def __init__(self):
        print(self.__class__.__bases__[0].__name__)

这样Foo()会输出:FooBarAbstract

请注意,mro方法和__mro__属性不适合您的用途,因为它们不仅包含父类,而且还包含当前类和父类的父类,因此您必须先跳过它们,然后才能获取父类。

答案 1 :(得分:1)

通过使用python __bases__,它将返回基类名称的元组:

class Foo():
    pass

class Bar(Foo):
    pass

bb = Bar
bb.__bases__[0].__name__
# 'Foo'

但是我不知道django中是否还有其他方法可以解决这个问题。

答案 2 :(得分:0)

尝试类似的方法,这是一个示例,您可以根据Django层次结构更改索引。

class Foo():
    pass

class Bar(Foo):
    pass

class Eggs(Foo):
    pass

Now for Eggs课

Eggs.mro()[-2].__name__ # change your index accordingly to your class inheritance structure.

  

返回Foo

有关信息:

Django的抽象类只是为了确保它们不会在数据库中创建额外的表。