为什么Python无法访问以双下划线开头的类属性?
报错原因
Python 对以两个下划线开头、且不以两个下划线结尾的类属性/实例属性会触发*名称改写(Name Mangling)*机制:解释器会自动将这类属性的名称重命名为_类名__原属性名的格式,核心作用是避免子类与父类的同名属性冲突,是Python原生提供的私有属性保护逻辑。
你代码中定义的__C完全符合名称改写的触发规则,因此类定义完成后,原名称__C已经不存在,实际被改写为_MyEnumType__C,直接访问MyEnumType.__C自然会抛出属性不存在的异常。
正确访问方式
方法1:直接使用改写后的属性名(仅适合调试场景)
直接调用改写后的属性名即可读取到对应值:
print(MyEnumType._MyEnumType__C)
提示:该方式绕过了属性私有化的设计约定,不推荐在正式业务代码中使用。
方法2:类内部封装公开访问接口(规范写法)
如果确实需要对外暴露该私有属性的读取权限,推荐在类内部封装专门的读取方法,符合面向对象的封装规范:
class MyEnumType(object): A = 1 B = 2 __C = 3 @classmethod def get_private_c(cls): return cls.__C # 调用公开接口访问 print(MyEnumType.get_private_c())
内容的提问来源于stack exchange,提问作者James Wierzba
相关产品推荐
相关产品推荐

