Можно ли определить внутренний класс в стиле Java (нестатический) (в области видимости класса) - PullRequest
0 голосов
/ 29 декабря 2018

Для тех, кто не знаком с 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>

Я попытался определить его более понятным способом, определив его в теле класса.Например:

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())

1 Ответ

0 голосов
/ 29 декабря 2018

Мне не совсем понятно, почему вы хотите вложить классы или создать экземпляр внутреннего класса с неявным аргументом.Пожалуйста, помните 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 (благодаря утка, набрав или наследование) без изменения класса Outer.

class NewInner(Inner):
    ...

outer = Outer()
inner = NewInner(outer)
...