Порядок исполнения с классом python - PullRequest
2 голосов
/ 22 апреля 2019

Я писал небольшой скрипт на python, чтобы понять концепцию, и получил еще одну путаницу. Вот код -

x = 5
y = 3

class Exp(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

        print("In",x, y, self.x, self.y)
    print("Middle",x,y)

print("Out",x,y)

Exp(1,2)

Выход -

Middle 5 3
Out 5 3
In 1 2 1 2

Теперь моя концепция заключалась в том, что интерпретатор python начинает читать и выполнять код с первой строки до последней строки. Он выполняет код внутри класса только тогда, когда он «вызывается», а не когда он определен. Таким образом, вывод должен выводить «Out» первым. Но здесь сначала печатается «Середина». Этого не должно случиться, так как интерпретатор Python при первом обнаружении «Middle» находится внутри определения и, следовательно, не должен выполняться в это время. Его следует выполнять только после прочтения последней строки кода, где вызывается класс «Exp».

Я искал решение в Google и StackOverflow, но не смог найти подходящее объяснение для класса.

Пожалуйста, помогите мне понять, где я ошибаюсь ...

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Такое странное поведение происходит потому, что ваш print("Middle",x,y) не входит в определение функции, поэтому он вызывается раньше print("Out",x,y).
Один из возможных «правильных» способов выполнить это - определить print("Middle",x,y) скажем в конструкторе.

x = 5
y = 3

class Exp(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

        print("In",x, y, self.x, self.y)
        print("Middle",x,y)

print("Out",x,y) 
Exp(1,2)

Результат, который вы получите, будет:

Out 5 3
In 1 2 1 2
Middle 1 2

Предыдущий код был эквивалентен.

x = 5
y = 3

class Exp(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y

        print("In",x, y, self.x, self.y)

print("Middle",x,y)
print("Out",x,y) 
Exp(1,2)

Чьим выходом будет.

Middle 5 3
Out 5 3
In 1 2 1 2
1 голос
/ 22 апреля 2019

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

print("Middle",x,y)

Вышеприведенное утверждение не относится ни к какому методу. Относится к классу Exp. Метод __init__() выполняется при создании объекта и вызывается внутренне интерпретатором Python, когда объект создается с вашей стороны. Поскольку вышеприведенный оператор не является частью какого-либо метода, интерпретатор просто выполняет его перед вызовом метода __init__. Поскольку переменные x и y определены в области видимости класса Exp, это не считается ошибкой, и интерпретатор выполняет ее.

Просто удалите объявления переменных x и y. И вы увидите NameError как что-то ниже.

Traceback (most recent call last):
  File "trial.py", line 9, in <module>
    print("Middle",x,y)
NameError: name 'x' is not defined

И это потому, что x и y даже не созданы с точки зрения класса Exp. Ура!

1 голос
/ 22 апреля 2019

Проблема связана с тем, что оператор print (middle) неправильно определен в классе Exp. Когда вы запускаете код, а компилятор проходит через скрипт, он наталкивается на эту строку печати (среднюю), которая не определена как метод класса Exp, но является исполняемой как встроенная функция, несмотря на пробелы.

Если вы попробуете код ниже, вы получите выходные данные «Out» и «In». Вы бы получили 'Middle', только вызвав Exp.test ()

x = 5
y = 3

class Exp(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

        print("In",x, y, self.x, self.y)

    def test(self):
        print("Middle",x,y)  

print("Out",x,y)

Exp(1,2)
...