Python 3.6如何实现类的部分初始化实例并后续补全属性
Python 3.6 实现类的部分初始化实例
首先修正原Foo类的__init__方法(缺少self参数,否则运行会报错):
class Foo: def __init__(self, a, b, c): self.a = a self.b = b self.c = c def sum(self): return self.a + self.b + self.c
以下提供两种符合需求的实现方案:
方法一:用闭包实现部分初始化函数
编写something函数,接收目标类和已确定的参数,返回一个可调用对象,后续传入剩余参数即可完成实例化:
def something(cls, **partial_kwargs): def wrapper(**remaining_kwargs): return cls(**partial_kwargs, **remaining_kwargs) return wrapper # 使用示例 partially_initialized = something(Foo, a=1, b=2) fully_initialized = partially_initialized(c=3) print(fully_initialized.sum()) # 输出 6
核心逻辑是利用闭包暂存已传入的参数,后续调用时合并所有参数再实例化类,完全匹配你的伪代码逻辑。
方法二:用类装饰器扩展初始化能力
如果希望类本身支持部分初始化的调用方式,可以通过装饰器包装类,生成支持后续补全参数的中间对象:
def partial_init_support(cls): class PartialWrapper: def __init__(self, **partial_kwargs): self.partial_kwargs = partial_kwargs self.cls = cls def __call__(self, **remaining_kwargs): return self.cls(**self.partial_kwargs, **remaining_kwargs) return PartialWrapper # 给Foo类添加装饰器 @partial_init_support class Foo: def __init__(self, a, b, c): self.a = a self.b = b self.c = c def sum(self): return self.a + self.b + self.c # 使用示例 partially_initialized = Foo(a=1, b=2) fully_initialized = partially_initialized(c=3) print(fully_initialized.sum()) # 输出 6
这种方式将部分初始化逻辑绑定到类本身,调用形式更贴近你的预期。
注意:两种方案都是在最终调用时才真正创建Foo的实例——Python中类实例必须通过__init__完成完整初始化,无法创建缺少必要属性的无效实例(否则sum方法会直接报错),上述实现通过暂存参数的方式,避免了实例处于未就绪状态。
内容的提问来源于stack exchange,提问作者Aleksei Khatkevich
相关产品推荐
相关产品推荐

