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

如何创建存储其他类对象的类?解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:20:46