Вот мой код:

class MyClass:

    def __init__(self):
        self.value = 0

    def set_value(self, value):
        self.value = 5

    def get_value(self):
        return self.value

    value = print("Hello")

a = MyClass()

Выход:

Hello

Я не понимаю, почему print("Hello") исполняется. Когда я создаю экземпляр класса, только переменная экземпляра устанавливается в 0. Почему self.value = 0 вызывает value = print("Hello")?

Может кто-нибудь объяснить мне это поведение?

0
Aliquis 28 Авг 2017 в 00:41

4 ответа

Лучший ответ

Код оценивает класс при его выполнении и вызывает print для определения переменной класса value.

Приведенный ниже пример показывает, что он печатается до создания экземпляра.

class MyClass:

    def __init__(self):
        self.value = 0

    def set_value(self, value):
        self.value = 5

    def get_value(self):
        return self.value

    value = print("Hello")

print('hi')
a = MyClass()

#output
>>> Hello
>>>hi
3
PRMoureu 27 Авг 2017 в 21:50

Не позволяйте отступам обмануть вас. value не является переменной экземпляра. value является переменной класса, потому что она определена в области видимости класса. Это то же самое, что и:

class MyClass:
    value = print("Hello")
    ....

Это означает, что вызов print будет выполнен в время определения класса . Другими словами, когда Python определяет MyClass, он также определяет все переменные уровня класса, включая value. Чтобы определить значение, он вызывает print, поэтому Hello печатается до того, как вы создадите экземпляр MyClass.

Если вы хотите, чтобы только экземпляры MyClass печатали Hello, поместите определение переменной в конструктор класса.

Примечание: Функция print возвращает None, поэтому кажется странным, что вы присваиваете значение переменной. Возможно, вы искали что-то вроде input?

2
Christian Dean 27 Авг 2017 в 21:49

Это не так. Эта печать выполняется, потому что она находится на самом уровне класса; тело класса выполняется во время определения класса. Вы получите этот вывод, даже если вы никогда не создавали экземпляр MyClass.

3
Daniel Roseman 27 Авг 2017 в 21:43

Нет, отбросьте a = MyClass(), и он все равно напечатает "Hello". Он выполняет код в теле, когда класс определен:

class MyClass:
    print(2 * 2)

# prints 4
1
Danil Speransky 27 Авг 2017 в 21:43