假设我有课程SuperModel
,Model
和SubModel
。
我想定义一个全局属性' 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')。
答案 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)