Python类特定的全局属性

2024-04-20 00:56:59 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有类SuperModelModelSubModel。你知道吗

我想定义一个全局属性“collection”,它是类的名称。例如,如果我这样做:

Model.collection

它将返回“Model”。你知道吗

如果我将模型子类化,就说class SubModel(Model)

Submodel.collection

将返回“Submodel”

有没有一种方法可以做到这一点,而不必显式地重写模型所有子代的属性?你知道吗

我试图从元类中得到一些东西:

class SuperModel(type):
    def __new__(cls, name, base, attrs):
        if 'collection' not in attrs:
            attrs['collection'] = __name__.lower()

    return super().__new__(cls, name, base, attrs)

class Model(metaclass=SuperModel):
    pass

但是,当我尝试对Model进行子类化(例如class SubModel(Model))时,当我需要“SubModel”时,在打印“collection”时总是得到“Model”。你知道吗

编辑:我知道有一个__name__属性,但是如果我想在每次定义类时将__name__赋值给类变量呢?因此,当子类化模型时,子模型中会有一个属性'collection',等于__name__('SubModel')。你知道吗


Tags: name模型newbasemodel属性定义全局
2条回答

您正在元类中使用模块global__name__。这既不是元类型的名称,也不是类的名称。你知道吗

您的元类已经在name属性中获得了新类的名称。简单地说:

class SuperModel(type):
    def __new__(cls, name, base, attrs):
        if 'collection' not in attrs:
            attrs['collection'] = name.lower()

    return super().__new__(cls, name, base, attrs)

已经有这样一个内置属性,它被称为__name__。你知道吗

>>> class Foo(object):
...     pass
>>> Foo.__name__
'Foo'

相关问题 更多 >