Когда переменная класса инициализируется в Python? - PullRequest
0 голосов
/ 31 декабря 2018

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

class A:
    b = LongRunningFunctionWithSideEffects()

Когда будет вызван LongRunningFunctionWithSideEffects()?На данный момент модуль импортируется?Или в данный момент класс впервые используется каким-то образом?

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Код внутри класса выполняется, когда встречается оператор class - т.е.во время самого импорта.

Это потому, что, в отличие от определений классов Java или C #, операторы Python class на самом деле являются исполняемым кодом.

class A:
  print("I'm running!") # yup, code outside a method or field assignment!
  b = print("Me too!")

print("Wait for me!")

Результат аккуратен в порядке выполнения:

I'm running!
Me too!
Wait for me!
0 голосов
/ 31 декабря 2018

Это делается во время импорта.Они называются статическими переменными и определяются на уровне класса.Эти переменные создаются 1 для класса, а НЕ 1 для объекта.Они являются частью загрузки класса, который происходит во время импорта.

Ниже приведен пример:

classA.py

class A:
    print("Printing before Static Variable Creation")
    class_var = 1

    def __init__(self):
        instance_var = 2

main.py

from classA import A

Печать перед созданием статической переменной

print('Printing Class Variable Value : ',A.class_var)

Значение переменной класса печати: 1

print(A.__dict__)

{' module ': 'classA', 'class_var': 1, ' init ': класс функции A.A. init (self), ' dict ': атрибут ' dict ' изОбъекты 'A', weakref ': атрибут weakref ' объектов 'A', ' doc ': нет}

0 голосов
/ 31 декабря 2018

На данный момент модуль импортируется

test.py:

def x():
    print('x')

class A:
    x = x()

затем

Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...