如何创建存储其他类对象的类?解决Python NameError问题
解决NameError: name '_Request__request' is not defined问题
问题原因
你遇到的错误是Python的**名称修饰(Name Mangling)**机制导致的:当用双下划线__开头定义类、属性或方法时,Python会自动将其重命名为_<包含该定义的类名>__<原名称>。比如如果__request是在Request类里定义的,它的实际名称会变成_Request__request,直接在Requests类里用__request就会找不到,触发NameError。
解决方案
方案1:改用单下划线(推荐)
把私有标识从双下划线改成单下划线_,这样不会触发名称修饰,同时也能表达"内部使用"的语义,在Requests类里可直接正常引用:
from enum import Enum from dataclasses import dataclass # 改用单下划线的枚举类 class _RequestType(Enum): GET = "GET" POST = "POST" # 改用单下划线的数据类 @dataclass class _Request: request_type: _RequestType content: str # 存储常用请求的类 class Requests: GET_USER = _Request(_RequestType.GET, "SELECT * FROM users WHERE id = %s") CREATE_USER = _Request(_RequestType.POST, "INSERT INTO users (name) VALUES (%s)") # 测试访问 print(Requests.GET_USER.request_type.value) # 输出: GET
方案2:使用修饰后的名称(不推荐)
如果坚持要用双下划线,需要在Requests类里使用Python修饰后的完整名称来引用:
from enum import Enum from dataclasses import dataclass class Request: class __RequestType(Enum): GET = "GET" POST = "POST" @dataclass class __Request: request_type: __RequestType content: str class Requests: # 使用修饰后的名称引用 GET_USER = Request._Request__Request(Request._Request__RequestType.GET, "SELECT * FROM users WHERE id = %s") print(Requests.GET_USER.request_type.value) # 输出: GET
显然方案1更简洁易维护,能避免名称修饰带来的额外复杂度。
内容的提问来源于stack exchange,提问作者Not Secret
相关产品推荐
相关产品推荐

