Вот мой код:
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")
?
Может кто-нибудь объяснить мне такое поведение?
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
Не позволяйте отступам обмануть вас. value
не является переменной экземпляра. value
является переменной класса, потому что она определена в области видимости класса. Это то же самое, что и:
class MyClass:
value = print("Hello")
....
Это означает, что вызов print
будет выполнен в время определения класса . Другими словами, когда Python определяет MyClass
, он также определяет все переменные уровня класса, включая value
. Чтобы определить значение, он вызывает print
, поэтому Hello
печатается до того, как вы создадите экземпляр MyClass
.
Если вы хотите, чтобы только экземпляры MyClass
печатали Hello
, поместите определение переменной в конструктор класса.
Примечание: Функция print
возвращает None
, поэтому кажется странным, что вы присваиваете значение переменной. Возможно, вы искали что-то вроде input
?
Это не так. Эта печать выполняется, потому что она находится на самом уровне класса; тело класса выполняется во время определения класса. Вы получите этот вывод, даже если вы никогда не создавали экземпляр MyClass.
Нет, отбросьте a = MyClass()
, и он все равно напечатает "Hello"
. Он выполняет код в теле, когда класс определен:
class MyClass:
print(2 * 2)
# prints 4
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.