Подтвердить что ты не робот

Есть статический конструктор или статический инициализатор в Python?

Есть ли такая вещь, как статический конструктор в Python?

Как реализовать статический конструктор в Python?

Вот мой код... __init__ не срабатывает, когда я вызываю приложение вроде этого. __init__ не является статическим конструктором или статическим инициализатором.

App.EmailQueue.DoSomething()

Мне нужно вызвать его так, чтобы каждый экземпляр класса App:

App().EmailQueue.DoSomething()

Вот мой класс:

class App:
    def __init__(self):
        self._mailQueue = EmailQueue()

    @property
    def EmailQueue(self):
        return self._mailQueue

Проблема с вызовом __init__ каждый раз заключается в том, что объект App воссоздается. Мой "настоящий" класс App довольно длинный.

4b9b3361

Ответ 1

Подсказка: все, что ссылается на self, потребует создания экземпляра класса. Вы можете сделать это следующим образом:

class App:
    email_queue = EmailQueue()

App.email_queue.DoSomething()

Но давай, это похоже на много пуха. Я с SLaks, просто инициализирую его вне класса. Кроме того, вы можете посмотреть одноэлементный шаблон.

Ответ 2

Существует принципиальное различие между статическими и динамическими языками, которые не всегда кажутся в первую очередь.

В статическом языке класс определяется во время компиляции, и все хорошо и устанавливается в бетоне до того, как программа когда-либо запускается.

В динамическом языке класс фактически определен во время выполнения. Как только интерпретатор разбирает и запускает все эти классы и инструкции def, запускается эквивалент статического конструктора. Определения классов выполняются в этой точке.

Вы можете поместить любое количество утверждений в любом месте тела класса, и они фактически являются статическим конструктором. Если вы хотите, вы можете поместить их все в функцию, которая не принимает self в качестве параметра и вызывает эту функцию в конце класса.

Ответ 3

Вам нужно создать экземпляр своего приложения, а затем использовать его:

myApp = App()
myApp.EmailQueue.DoSomething()