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

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

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

хотя это не совсем та же проблема, я следовал Python трудный путь, ex42 - the while loop @ lines 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 ищет дом, используя его имя, так что вы готовы позвонить на него в ближайшее время, и придумывает другое место, если вы не найдете дом -- С

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)

4 ответов


вы self.name до строка "get_thing", а не функция get_thing.

если вы хотите self.name чтобы быть функцией, вы должны установить ее в один:

setattr(self, 'name', self.get_thing)

однако это совершенно необязательно для вашего другого кода, потому что вы можете просто вызвать его напрямую:

value_returned = self.get_thing()

на Python docs скажите все, что нужно сказать, насколько я могу видеть.

setattr(объект, имя, стоимостью)

Это аналог getattr(). Аргументы являются объектом, строкой и произвольным значением. Строка может называть существующий атрибут или новый атрибут. Функция присваивает значение атрибуту при условии, что объект позволяет это. Для пример,setattr(x, 'foobar', 123) эквивалентно x.foobar = 123.

если этого недостаточно, объясните, чего вы не понимаете.


Setattr: Мы используем setattr добавить атрибут к нашему экземпляру класса. Мы передаем экземпляр класса, имя атрибута и значение. и с функцией getattr мы повторяем эти значения

Employee = type("Employee", (object,), dict())

employee = Employee()

# Set salary to 1000
setattr(employee,"salary", 1000 )

# Get the Salary
value = getattr(employee, "salary")

print(value)

Предположим, вы хотите дать атрибуты экземпляру, который ранее не был написан в коде. The setattr() делает именно это. Он принимает экземпляр класса self и ключ и значение.

class Example:
    def __init__(self, **kwargs):
        for key, value in kwargs.items():
            setattr(self, key, value)