Вызов Python __init __ () только один раз - PullRequest
2 голосов
/ 28 октября 2011

Есть ли способ вызвать метод init () класса только один раз.Или как я могу отключить вызов init () при создании объекта из класса?

Ответы [ 4 ]

7 голосов
/ 28 октября 2011

Если вам нужен singleton , где есть только один экземпляр класса, тогда вы можете создать декоратор, подобный следующему, полученный из PEP18 :

def singleton(cls):
    instances = {}
    def getinstance():
        if cls not in instances:
            instances[cls] = cls()
        return instances[cls]
    return getinstance

@singleton
class MyClass:
    pass

Попробуйте:

>>> a = MyClass()
>>> b = MyClass()
>>> a == b
True
2 голосов
/ 28 октября 2011

Нет прямого способа отключить __init__, но есть несколько способов обойти это. У одного из них есть флаг:

class Class:
    _init_already = False
    __init__(self):
        if not Class._init_already:
            ...
            Class._init_already = True

Но это безобразно. Что вы действительно пытаетесь достичь?

1 голос
/ 28 октября 2011

Вы не должны помещать в __init__() ничего, что вы хотите запустить только один раз.Каждый раз, когда вы создаете экземпляр класса __init__(), он будет запускаться.

Если вы хотите настроить создание своего класса, вам следует заняться созданием метакласса .По сути, это позволяет определить функцию, которая запускается только один раз, когда класс определяется впервые.

0 голосов
/ 28 октября 2011

Метод init будет вызываться всегда, однако вы можете создать другой метод с именем run () или что-то, что вы вызываете после создания объекта, необязательно.

foo = ClassName()
foo.run() # replacement for __init__

foo2 = ClassName()
...