You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:47:59