Использование setattr() в python

Я ищу кого-то, кто объяснит основы того, как использовать, а не использовать setattr( ).

Моя проблема возникла при попытке использовать один метод/функцию класса для возврата данных, которые затем помещаются в другой метод/функцию. Возможно, в этом случае более простой подход был бы намного лучше, но я пытаюсь понять, как работают/используются классы. Эта проблема, кажется, зависит от setattr(), и это моя попытка довольно просто использовать это.

Хотя это не совсем та же проблема, я следовал Python The Hard Way, ex42 — циклу while в строках 18-41.

Я попытался написать \__init__() и использовать вместо этого getattr(), думая, что, возможно, что-то должно быть в пространстве имен класса, но это не похоже на помощь.

#! /bin/python2.6

class HolyGrail(object):

    def __init__(self):
        self.start = 'start_at_init'

    # function definition in question:
    # TypeError: 'str' object is not callable

    def run_it(self):
        start = setattr(self, 'name', 'get_thing')
        start = self.name

        # Something wrong here?
        value_returned = start() #I believe this == self.get_thing()
        use_it(value_returned)

    """
    # alternate function definitions
    # NameError: global name 'start' is not defined

    def __init__(self):
        self.start = 'get_thing'

    def run_it(self):
        go_do_it = getattr(self, start)
        first_output = go_do_it()
        use_it(first_output)
    """

    def get_thing(self):
        return "The Knights Who Say ... Ni!"

    def use_it(self, x):
        print x
        print "We want a shrubbery!"

my_instance = HolyGrail()
my_instance.run_it()

@Karl Knechtel, @Amber , @Chris Morgan спасибо за вашу помощь.

Думаю, теперь я могу объяснить свой ответ! Это требовало от меня лучшего понимания себя как объекта. Это имя экземпляра, которое помечается такими вещами, как атрибуты.

Классом может быть Город, а затем. getattr ищет дом по его названию, чтобы вы были готовы позвонить ему в ближайшее время, и предлагает другое место, если вы не найдете дом -- С помощью getattr существует "имя", и вы должны найти его. Делает шаг от одной функции к другой динамичным В качестве бонуса у вас может быть значение по умолчанию, полезное для получения резервного метода по умолчанию — сбой соединения или что-то в этом роде?

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

Я мог бы написать свою функцию несколькими способами, но нет необходимости менять какие-либо атрибуты:

def run_it(self):
    yo = getattr(self, 'get_thing')
    answer = yo()
    setattr(self, 'deal_accepted', self.use_it) #really ott
    no = getattr(self, 'deal_accepted')
    no(answer)

Правильно исправленный код:

def run_it(self):
    value_returned = self.get_thing()
    self.use_it(value_returned)

54
задан bounce 6 March 2012 в 18:16
поделиться