Я ищу кого-то, кто объяснит основы того, как использовать, а не использовать 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)