Когда статические переменные инициализируются в Python? - PullRequest
0 голосов
/ 04 мая 2019

Рассмотрим следующий код

class Foo:
    i = 1 # initialization
    def __init__(self):
        self.i += 1

t = Foo()
print(t.i)

Когда именно происходит инициализация i ? До выполнения метода init или после it?

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Перед.

Метод __init__ не запускается, пока не будет создан экземпляр Foo.i=1 запускается всякий раз, когда определение класса встречается в коде

Это можно увидеть, добавив операторы print:

print('Before Foo')
class Foo:
    i = 1
    print(f'Foo.i is now {i}')

    def __init__(self):
        print('Inside __init__')
        self.i += 1
        print(f'i is now {self.i})
print('After Foo')

print('Before __init__')
foo = Foo()
print('After __init__')

, которые выводят:

Before Foo
Foo.i is now 1
After Foo
Before __init__
Inside __init__
i is now 2
After __init__

Обратите внимание, что ваш self.i += 1 не изменяет атрибут класса Foo.i.

foo.i # This is 2
Foo.i # This is 1
0 голосов
/ 04 мая 2019

Атрибут класса инициализируется при первом использовании ClassName в исходном коде, также вы используете атрибут класса в коде, выполняя ClassMethod.attribute

class Foo:
    i = 1 # initialization
    def __init__(self):
        #Use ClassName.attribute to access class attribute
        Foo.i += 1

#I used the Name of the class here, Foo.i will be 1
print(Foo.i)
#1

#Instantiated Foo
t = Foo()

#Value of i changes to 2
print(t.i)
#2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...