对于那些不熟悉Java的人来说,非静态内部类是这样的类,即对象引用了创建它的外部对象。
这当然可以在python中通过在构造函数中创建类来实现。例如:
>>> class Outer:
... def __init__(self):
... class inner:
... _outer = self
... self.Inner = Inner
>>> outer = Outer()
>>> inner = outer.Inner()
>>> outer
<__main__.Outer object at 0x7f61f9d8e978>
>>> inner._outer
<__main__.Outer object at 0x7f61f9d8e978>
我试图通过在类主体中定义它来以更类似于Java的方式定义它。例如:
def nonstatic(cls):
def ctor(*args, **kwds):
return cls(*args, **kwds)
return ctor
class Outer:
@nonstatic
class Inner:
pass
这是一种可行的方法,但这不是一个非常灵活的解决方案。例如Outer()。Inner只是一个构造函数,而不是类型。这也意味着该解决方案将禁止从Inner类继承。
现在的问题是,有什么解决方案可以在那定义它吗?还是这样的尝试注定要以某种方式失败?我倾向于认为它注定要失败,但是我想提出一个理由,说明为什么会这样(或者它会变得凌乱吗?)。
我没有提到它,但是我正在寻找一种解决方案,其中可以将内部类作为实例使用外部对象作为隐式参数进行实例化,就像方法(即outer = inner.Outer()
)
答案 0 :(得分:0)
我不清楚,为什么要嵌套类或使用隐式参数实例化内部类。请记住Zen of Python:
...
Explicit is better than implicit.
Simple is better than complex.
...
您能详细说明一个用例吗?
由于我认为您的示例不需要嵌套,因此您可以简单地使用
class Inner:
def __init__(self, outer: 'Outer') -> None:
self.outer = outer
class Outer:
def create_inner(self) -> Inner:
return Inner(self)
outer = Outer()
inner = outer.create_inner()
# or
inner = Inner(outer)
后者的一个好处是,如果您可以使用另一个Inner
类(由于duck typing或继承)而无需修改Outer
类。
class NewInner(Inner):
...
outer = Outer()
inner = NewInner(outer)