Как я могу присвоить значение для вывода метода в Python? - PullRequest
0 голосов
/ 02 мая 2018

Я уже некоторое время кодирую в Python, и совсем недавно у меня появилась идея для некоторых скриптов, которые могут сломать Python. Одним из них является присвоение значения возвращаемому значению метода. Почему этот кодекс законен? Разве это не должно вызвать ошибку? Если нет, есть ли применение такой интерпретации?

class SomeClass:
  x = 10

def Method():
  return SomeClass()

print(Method().x)  

#This line concerns me!
Method().x = 5


print(Method().x)  

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

По сути, вы создаете класс с именем SomeClass с атрибутом класса x = 10.

Как указано здесь , атрибут класса похож - но не идентичен - ключевому слову static, используемому в классах в некоторых языках программирования, таких как C ++ или Java.

В соответствии с документами Python (https://docs.python.org/2/tutorial/classes.html), [...] Атрибуты класса также могут быть назначены, так что вы можете изменить значение SomeClass.x с помощью присваивания. [ ...]

Однако это не ваш случай, потому что каждый раз, когда вы вызываете функцию Method(), вы в основном создаете новый экземпляр SomeClass().



РЕДАКТИРОВАТЬ : Посмотрите на это

class SomeClass:
  x = 10

def Method():
  return SomeClass()

myInstance = Method()
print(myInstance.x)     # prints '10'

myInstance.x = 5
print(myInstance.x)     # prints '5'


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

0 голосов
/ 02 мая 2018

Выражение Method().x = 5 допустимо, но в основном ничего не делает. Сначала код создает новый экземпляр SomeClass, присваивая 5 его полю x и, наконец, отбрасывая его, поскольку экземпляр SomeClass нигде не сохраняется. print(Method().x) впоследствии создает еще один свежий экземпляр SomeClass и печатает значение его поля x, которое было инициализировано до 10 и никогда не изменялось.

Вкратце: каждый Method() создает новый независимый экземпляр класса SomeClass со своим собственным отдельным полем x.

Это будет работать:

instance = Method()
instance.x = 5
print(instance.x)
...