如何用Lambda实现工厂方法?调用Foo.store时遇参数未填充错误
问题分析与解决方法
核心问题拆解
- 实例方法调用方式错误:
store是实例方法,默认第一个参数为self,直接通过Foo.store()调用时,Python会把传入的lambda当作self,导致factory参数未被填充,触发"Parameter 'factory' unfilled"错误。 - 语法缺失:
store方法定义末尾缺少冒号:,属于基础语法错误。 - 构造函数参数不匹配:
Bar.__init__未定义参数,但lambda中传入了k给Bar(k),会引发参数不匹配异常。 - 抽象方法依赖未完善:使用
@abstractmethod需要让Foo继承ABC类,并导入abc模块,否则抽象方法无法生效。
修正后的代码实现
实例方法版本
from abc import ABC, abstractmethod from typing import Callable class Bar: def __init__(self, key: str): # 新增参数匹配lambda的传参 self.key = key class Foo(ABC): # 继承ABC类以支持抽象方法 @abstractmethod def store(self, factory: Callable[[str], Bar]): # 补充self参数与方法末尾冒号 obj = factory("abc") print(f"创建的Bar实例key值: {obj.key}") # 实现Foo的具体子类 class ConcreteFoo(Foo): def store(self, factory: Callable[[str], Bar]): super().store(factory) # 正确调用:先实例化子类再调用方法 ConcreteFoo().store(lambda k: Bar(k))
类方法版本(支持直接通过类调用)
如果需要直接用Foo.store()的方式调用,可以将store改为类方法:
from abc import ABC, abstractmethod from typing import Callable class Bar: def __init__(self, key: str): self.key = key class Foo(ABC): @classmethod @abstractmethod def store(cls, factory: Callable[[str], Bar]): obj = factory("abc") print(f"创建的Bar实例key值: {obj.key}") class ConcreteFoo(Foo): @classmethod def store(cls, factory: Callable[[str], Bar]): super().store(factory) # 直接通过子类调用类方法 ConcreteFoo.store(lambda k: Bar(k))
关键修正说明
- 方法类型与调用匹配:实例方法需先创建类实例再调用,类方法可直接通过类调用,根据需求选择对应方式。
- 参数一致性:确保
Bar的构造函数参数与lambda传入的参数数量、类型匹配。 - 语法补全:修复方法定义末尾的冒号缺失问题,保证代码语法合法。
- 抽象方法规范:让
Foo继承ABC类,满足Python抽象方法的使用要求。
内容的提问来源于stack exchange,提问作者AppDeveloper
相关产品推荐
相关产品推荐

