【问题标题】:Is it possible to define java-style (non-static) inner class (in class scope)是否可以定义 java 风格(非静态)内部类(在类范围内)
【发布时间】:2018-12-29 11:06:07
【问题描述】:

对于那些不熟悉 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()

【问题讨论】:

  • 请不要使用java 标记非Java 问题,即使您引用Java 进行比较也是如此。它为无法回答的 Java 人员提出了问题。

标签: python python-3.x decorator inner-classes


【解决方案1】:

我不太清楚,为什么要嵌套类或使用隐式参数实例化内部类。请牢记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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-21
    • 2010-10-20
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多