Использование setattr() в python
Я ищу кого-нибудь, чтобы объяснить основы использования, а не использовать setattr()
.
Моя проблема возникла при попытке использовать один метод/функцию класса для возврата данных, которые затем помещаются в другой метод/функцию. Возможно, в этом случае более простой подход будет намного лучше, но я пытаюсь понять, как работают/используются классы. Эта проблема, похоже, зависит от setattr()
, и это моя попытка сделать довольно простое использование этого.
Хотя это не совсем та же проблема, я следил за Python The Hard Way, ex42 < t22 > 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, @Крис Морган благодарит за вашу помощь.
Думаю, теперь я могу объяснить свой собственный ответ! Это потребовало лучшего понимания себя как объекта для меня. Это имя экземпляра, в котором отмечены такие атрибуты, как атрибуты.
Класс может быть городом, а затем.
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)
Ответы
Ответ 1
Вы устанавливаете self.name
в строку "get_thing"
, а не в функцию get_thing
.
Если вы хотите, чтобы функция self.name
была функцией, вы должны установить ее в единицу:
setattr(self, 'name', self.get_thing)
Однако это совершенно не нужно для вашего другого кода, потому что вы можете просто вызвать его напрямую:
value_returned = self.get_thing()
Ответ 2
Документы Python говорят обо всем, что нужно сказать, насколько я могу судить.
setattr
(объект, имя, значение)
Это аналог getattr()
. Аргументами являются объект, строка и произвольное значение. Строка может называть существующий атрибут или новый атрибут. Функция присваивает значение атрибуту, если объект разрешает его. Например, setattr(x, 'foobar', 123)
эквивалентно x.foobar = 123
.
Если этого недостаточно, объясните, что вы не понимаете.
Ответ 3
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)
Ответ 4
Предположим, вы хотите предоставить атрибуты экземпляру, который ранее не был написан в коде.
setattr()
делает именно это.
Он принимает экземпляр класса self
и ключа и значения для установки.
class Example:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
Ответ 5
Чтобы добавить к другим ответам, я нашел общий случай использования setattr()
при использовании конфигов. Распространено разбирать конфиги из файла (.ini файла или чего-либо еще) в словарь. Таким образом, вы получите что-то вроде:
configs = {'memory': 2.5, 'colour': 'red', 'charge': 0, ... }
Если вы хотите затем назначить эти конфиги классу, который будет храниться и передаваться, вы можете сделать простое назначение:
MyClass.memory = configs['memory']
MyClass.colour = configs['colour']
MyClass.charge = configs['charge']
...
Тем не менее, гораздо проще и менее многословно перебирать конфиги, а setattr()
так:
for name, val in configs.items():
setattr(MyClass, name, val)
Пока ваши ключи словаря имеют правильные имена, это работает очень хорошо и приятно и аккуратно.
* Обратите внимание, что ключи dict должны быть строками, так как они будут именами объектов класса.