如何在Python类作用域中自动获取类名定义类变量?
好问题!在类作用域内直接获取类名确实没法像类方法里那样用 cls.__name__ —— 毕竟类在定义阶段还没完全实例化完成呢。不过有几个实用的方案能帮你实现需求,不用硬写类名:
方案1:用元类(Metaclass)实现全局复用
元类是负责创建类的"类",它会在你的类被正式定义前介入流程,刚好能拿到类名并动态设置属性:
class MyMeta(type): def __new__(cls, class_name, bases, attrs): # class_name就是当前正在创建的类的名称 attrs['ClassTag'] = '!' + class_name return super().__new__(cls, class_name, bases, attrs) # 把元类指定给你的类 class MyClass(metaclass=MyMeta): pass print(MyClass.ClassTag) # 输出: !MyClass
这种方法适合需要给多个类统一添加ClassTag的场景,只要在定义类时指定metaclass=MyMeta就行,一劳永逸。
方案2:用类装饰器实现轻量需求
如果只是单个或少数几个类需要这个属性,类装饰器更直观,它会在类定义完成后修改类的属性:
def add_class_tag(target_cls): target_cls.ClassTag = '!' + target_cls.__name__ return target_cls @add_class_tag class MyClass: pass print(MyClass.ClassTag) # 输出: !MyClass
装饰器的逻辑非常直白,拿到已经创建好的类,直接取__name__拼接后赋值给ClassTag,代码可读性很高。
方案3:用__init_subclass__(Python 3.6+)给子类自动赋值
如果你的类是作为父类供其他子类继承,Python 3.6+新增的__init_subclass__方法会在子类创建时自动触发,刚好能给子类动态设置属性:
class BaseWithTag: def __init_subclass__(cls): cls.ClassTag = '!' + cls.__name__ # 子类继承后自动拥有ClassTag class MyClass(BaseWithTag): pass print(MyClass.ClassTag) # 输出: !MyClass
这种方式不需要额外的元类或装饰器,适合给一组子类统一添加属性的场景。
内容的提问来源于stack exchange,提问作者gt6989b
相关产品推荐
相关产品推荐

