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