Инициализация переменной класса в python

У меня есть класс с переменной, которая должна быть экземпляром этого класса. Я не могу создать экземпляр в строке объявления, потому что интерпретатор python не знает, как создать объект в данный момент. Существует возможный обходной путь: инициализация после объявления класса.

class A(object):
    static_variable = None

    def some_method(self, a=static_variable):
       print a

A.static_variable = A()

Но мне нужно использовать эту переменную класса в качестве аргумента по умолчанию. Решить проблему можно так:

def some_method(self, a=None):
    a = a if a else A.static_variable
    print a

Тем не менее, это выглядит очень не пифонично для меня. Будем благодарны за любые предложения о том, как использовать этот тип статической переменной в качестве аргумента по умолчанию.

1 ответ

Python не поддерживает "статические" переменные в том смысле, как это делают языки, подобные C++. Так что в этом случае static_variable - это на самом деле переменная класса, поэтому вы столкнулись с этой проблемой. Я уверен, что вы уже знаете это, но другие могут когда-нибудь наткнуться здесь и увидеть, как мы называем это статической переменной, так что кажется, что мы должны это выяснить для потомков.

Я думал, что поскольку static_variable все еще является членом класса A, возможно, был выход из положения, вообще не использовав его в качестве аргумента.

Можете ли вы использовать аргумент ключевого слова в some_method()?

вместо того, чтобы использовать его в качестве аргумента по умолчанию для функции, вы можете просто вызвать переменную "A.static_variable", если kwarg не использовался.

class A(object):
    static_variable = None

    def some_method(self, *, a=None):
        if a:
            print(a)
        else:
            print(A.static_variable)

A.static_variable = A()
Другие вопросы по тегам