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

如何用Lambda实现工厂方法?调用Foo.store时遇参数未填充错误

问题分析与解决方法

核心问题拆解

  1. 实例方法调用方式错误:store是实例方法,默认第一个参数为self,直接通过Foo.store()调用时,Python会把传入的lambda当作self,导致factory参数未被填充,触发"Parameter 'factory' unfilled"错误。
  2. 语法缺失:store方法定义末尾缺少冒号:,属于基础语法错误。
  3. 构造函数参数不匹配:Bar.__init__未定义参数,但lambda中传入了k给Bar(k),会引发参数不匹配异常。
  4. 抽象方法依赖未完善:使用@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:22:34