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

Python含映射字典的Factory类触发TypeError,如何修复?

修复工厂类的 classmethod 调用错误

你遇到的问题是因为CASE_TO_METHOD_MAP中存储的是未绑定的classmethod对象,直接调用这类对象会触发TypeError——classmethod必须绑定到类或实例后才能正常调用。以下是几种可行的修复方案:

方案1:通过方法名字符串获取绑定后的类方法

把字典中的值改为方法名字符串,在create方法里用getattr获取已绑定到类的方法:

import uuid

class CreateCaseFactory:
    @classmethod
    def create(cls, user_id: uuid.UUID, type_: str) -> str:
        creator_name = cls.CASE_TO_METHOD_MAP.get(type_)
        if creator_name:
            creator = getattr(cls, creator_name)
            return creator(user_id)
        else:
            raise ValueError("Invalid type")  # 建议使用更具体的异常类型

    @classmethod
    def _create_case_1(cls, user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 1 created for user {user_id}"
        return result

    @classmethod
    def _create_case_2(cls, user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 2 created for user {user_id}"
        return result

    CASE_TO_METHOD_MAP = {
        "case_1": "_create_case_1",
        "case_2": "_create_case_2",
    }

方案2:手动绑定classmethod到类

在调用前,通过classmethod对象的__get__方法手动绑定到当前类:

import uuid

class CreateCaseFactory:
    @classmethod
    def create(cls, user_id: uuid.UUID, type_: str) -> str:
        creator = cls.CASE_TO_METHOD_MAP.get(type_)
        if creator:
            # 手动将类方法绑定到当前类
            bound_creator = creator.__get__(None, cls)
            return bound_creator(user_id)
        else:
            raise ValueError("Invalid type")

    @classmethod
    def _create_case_1(cls, user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 1 created for user {user_id}"
        return result

    @classmethod
    def _create_case_2(cls, user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 2 created for user {user_id}"
        return result

    CASE_TO_METHOD_MAP = {
        "case_1": _create_case_1,
        "case_2": _create_case_2,
    }

方案3:改用静态方法(如果无需访问类属性)

如果你的创建方法不需要访问类本身的属性或方法,可以把@classmethod改成@staticmethod,这样直接调用字典里的方法就不会有问题:

import uuid

class CreateCaseFactory:
    @classmethod
    def create(cls, user_id: uuid.UUID, type_: str) -> str:
        creator = cls.CASE_TO_METHOD_MAP.get(type_)
        if creator:
            return creator(user_id)
        else:
            raise ValueError("Invalid type")

    @staticmethod
    def _create_case_1(user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 1 created for user {user_id}"
        return result

    @staticmethod
    def _create_case_2(user_id: uuid.UUID) -> str:
        result = f"Dummy Use Case 2 created for user {user_id}"
        return result

    CASE_TO_METHOD_MAP = {
        "case_1": _create_case_1,
        "case_2": _create_case_2,
    }

额外提示:建议把通用的Exception替换为更具体的ValueError,这更符合Python的异常设计规范。

内容的提问来源于stack exchange,提问作者KZiovas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 01:02:53