Python类特定的全局属性

时间:2014-03-19 18:23:00

标签: python class inheritance global-variables metaclass

假设我有课程SuperModelModelSubModel

我想定义一个全局属性' collection'这是班级的名称。例如,如果我这样做:

Model.collection

它将返回' Model'。

如果我是Model的子类,请说class SubModel(Model)

Submodel.collection

将返回'子模型'

有没有办法在没有明确重写Model的所有后代的属性的情况下这样做?

我试图从元类中获取一些东西:

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))子类化时,我总是得到' Model'什么时候打印'收集'当我期待' SubModel'。

编辑:我知道有__name__属性,但是如果我想在每次定义类时将__name__分配给类变量,该怎么办?因此,当继承Model时,会有一个属性' collection'在SubModel中等于__name__(' SubModel')。

2 个答案:

答案 0 :(得分:2)

内置了这样的属性,它被称为__name__

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

答案 1 :(得分:0)

您在元类中使用模块全局__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)