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
相关产品推荐
相关产品推荐

