Почему полученная строка может быть интерпретирована как функция в Python?

1

Я проскользнул через 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()
  • 3
    Вы уже читали о функции getattr() ? Что смутило вас о том, как работает эта функция?
Теги:
string
function

2 ответа

5
Лучший ответ

То, что вы видите, является результатом 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()

4

Трюк - это функция getattr. Он получает атрибут от объекта, учитывая его имя. Имя - это строка. имена методов (связанных функций) передаются как next переменная, getattr получает метод, а следующая строка вызывает его, изменяя следующую переменную. Это в основном автомат.

Сообщество Overcoder
Наверх
Меню