Я проскользнул через Learn python the hard way
и я столкнулся с фрагментом кода, как показано ниже. Но я не понял, что позади, функция в основном возвращает строку, в которой у класса есть функция с тем же именем. И он может вызвать функцию должным образом. Ну, вы поймете, что я имею в виду, когда вы смотрите на код.
from sys import exit
class Game(object):
def __init__(self, start):
self.start = start
def play(self):
next = self.start
while True:
print "\n--------"
room = getattr(self, next)
next = room()
def a1(self):
print "You are in a1, redirecting to a2"
return 'a2'
def a2(self):
print "You are in a2, exiting"
return 'death'
def death(self):
print 'You died'
exit(0)
a_game = Game('a1')
a_game.play()
То, что вы видите, является результатом getattr()
. Python - это язык высокого уровня, а другой - интерпретируемый. Поскольку все объекты в python в основном сконструированы в памяти в виде хэш-таблиц, Python имеет довольно обширный механизм Reflection.
Это означает, что Python может проверять и изменять свои собственные классы и объекты во время выполнения, и одним из способов сделать это является встроенный getattr()
. getattr
извлекает значение члена в первом аргументе, имя которого оно получает как строку во втором аргументе. getattr(x, "y")
в основном совпадает с xy
, но getattr
также позволяет более безопасный подход, когда значение по умолчанию может быть задано, если элемент фактически не присутствует: getattr(x, "y", "No such member")
. Если x
не имеет члена y
тогда xy
вызывает исключение AttributeError
. С другой стороны, gettattr(x, "y", "No such member")
вернет строку "Нет такого элемента", и исключение не будет создано.
В вашем случае методы помещаются в next
переменную как строки и доступны через встроенный getattr()
встроенный в room
. room()
затем вызывается, а следующее имя методов возвращается и сохраняется в next
. Это повторяется в while
петля до exit(0)
не вызывается в Game.death()
.
Вы также должны посмотреть на setattr()
и hasattr()
Трюк - это функция getattr
. Он получает атрибут от объекта, учитывая его имя. Имя - это строка. имена методов (связанных функций) передаются как next
переменная, getattr получает метод, а следующая строка вызывает его, изменяя следующую переменную. Это в основном автомат.
getattr()
? Что смутило вас о том, как работает эта функция?