NameError в Class является его собственным контроллером при объявлении статических значений - PullRequest
0 голосов
/ 03 января 2019

Я хочу, чтобы класс был его собственным контроллером и инициировал несколько значений по умолчанию, таким образом:

class Foo:
    FOOS = [Foo(5), Foo(3), Foo(4)]

    def __init__(self, bar):
        self.bar = bar

Но я получаю NameError исключение:

`Traceback (most recent call last):
  File "/home/user/test.py", line 1, in <module>
    class Foo:
  File "/home/user/test.py", line 2, in Foo
    FOOS = [Foo(5), Foo(3), Foo(4)]
NameError: name 'Foo' is not defined

Вопрос: Как правильно Pythonic иметь класс, являющийся его собственным контроллером?

Sidenote: Я не могу поверить, что я первый, кто столкнулся с этой проблемой. Если это дубликат, я не нашел его.

РЕДАКТИРОВАТЬ: см. Комментарий, чтобы понять, почему я думаю, что это не дубликат связанного вопроса, я не хочу загрязнять свой вопрос объяснениями по этому поводу.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Имейте в классе статический метод, который инициализирует нужные значения, которые должны быть вызваны перед созданием любых экземпляров класса.Это может быть выполнено путем вызова ошибки при попытке:

class Foo:
    FOOS = []
    init = False

    def __init__(self, bar):
        if not Foo.init:
            pass # raise some error
        self.bar = bar

    @staticmethod    
    def initialise():
        if not Foo.init:
            Foo.init = True
            Foo.FOOS = [Foo(5), Foo(3), Foo(4)]

Foo.initialise()
thing = Foo(2)
0 голосов
/ 03 января 2019

Вы можете сделать это так:

class Foo:
    pass

Foo.FOOS = [ Foo(), Foo() ]
...