如何将内部类实例绑定到外部类实例?基于OuterBase的实现
代码先行
我们的目标是设计OuterBase类,使得以下代码能够通过验证:
class Outer(OuterBase): def __init__(self, foo: str) -> None: self.foo = foo class Inner: outer: Outer def get_foo(self) -> str: return self.outer.foo inner = Outer("bar").Inner() assert inner.get_foo() == "bar"
我的问题与另一问题密切相关,但存在关键差异:那个问题聚焦于从内部类访问外部类,而我的问题则是要访问外部类的特定实例。
问题
已知Outer类及其内部定义的Inner类,以及一个Outer的实例,能否将该实例传入Inner的构造函数,从而将Inner实例与该Outer实例绑定?
即当执行outer = Outer()和inner = outer.Inner()后,inner的某个属性能持有outer的引用。
次要要求
1)尽可能简化使用(最小化样板代码)
理想情况下,实现实例绑定的全部逻辑应封装在Outer类中。用户只需继承OuterBase类,定义约定好名称的Inner类,即可预期其outer属性持有外部类实例的引用。对内部类使用装饰器、显式传入元类或定义特殊__init__方法等方案均视为次优。
2)尽可能保证类型安全
实现代码和使用代码应能通过mypy --strict检查,尽可能减少动态类型的使用。
假设实际应用场景
例如,内部类可作为外部类实例的配置容器,类似Pydantic的设计。Pydantic中的内部Config类是类级配置,适用于模型(外部类)的所有实例。而采用本文探讨的方案后,Pydantic模型的使用方式保持不变,但可通过将特定Config实例绑定到特定模型实例,实现实例级的配置差异。
内容的提问来源于stack exchange,提问作者Daniel Fainberg
相关产品推荐
相关产品推荐

