如何在Python中动态查找子类的包名?

如何在Python中动态查找子类的包名?,python,django,Python,Django,在上下文中,我正在编写一个使用Django的ORM的库。我不希望库的用户每次对自定义模型超类进行子类化时都必须定义app_标签,相反,我希望为使用它创建的项目强制执行一个标准结构,以确保对模型超类进行子类化的每个类的包名将等于app_标签。以下是我目前拥有的代码: class Model(django.db.models.Model): class Meta: abstract = True def __init_subclass__(cls, **kwargs

在上下文中,我正在编写一个使用Django的ORM的库。我不希望库的用户每次对自定义模型超类进行子类化时都必须定义app_标签,相反,我希望为使用它创建的项目强制执行一个标准结构,以确保对模型超类进行子类化的每个类的包名将等于app_标签。以下是我目前拥有的代码:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        # package_name = ???
        cls._meta.app_label = package_name
那个???部分是我似乎无法理解的。有什么想法吗?

我找到了。我就是这样实现的:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        mod = inspect.getmodule(cls)
        base, _sep, _stem = mod.__name__.partition('.')
        cls._meta.app_label = base
或者,这也应该起作用:

class Model(django.db.models.Model):
    class Meta:
        abstract = True

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        mod = inspect.getmodule(cls)
        cls._meta.app_label = mod.__package__.split('.')[-1]

不确定你所说的包名称是什么意思,你能举个例子吗?@IainShelvington我指的是定义子类的模块所在的包的名称。