Использование 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)