I am looking for someone to explain the basics of how to use, and not use setattr()
.
My problem arose trying to use one class method/function to return data that is then put in another method/function. Perhaps a simpler approach would be much better in this case, but I'm trying to understand how classes work/are used. This problem seems to hinge on setattr()
, and this is my attempt to make a fairly simple use of this.
Though it's not quite the same problem, I was following Python The Hard Way, ex42—the while
loop @ lines 18-41.
I tried writing an \__init__()
, and using getattr()
instead, thinking perhaps something needed to be in the class' namespace, but this doesn't seem to help.
#! /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 thanks for your help.
I think I can now explain my own answer! This required a better grasp of self as an object for me. It's an instance name that gets tagged up with stuff like attributes.
The class could be a Town, and then.
getattr
looks for a house using it's name so you are ready to call on it soon, and comes up with a different place if you don't find the house
--With getattr
a 'name' exists, and you go find it. Makes the step from one function to another dynamic
As a bonus you may have a default value, useful to get a fallback default method--connection failed or something?
setattr
builds a house and gives it a name so you can call in on it later.
You could potentially rebuild this house, or go to a particular place if you are unable to find it.
--setattr
makes an attribute name and gives, or changes it's value, to be called on later
Perhaps a user turns sound off, then future methods don't output any audio.
I could have written my function a number of ways, but there's no need to change any attributes:
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)
Properly corrected code:
def run_it(self):
value_returned = self.get_thing()
self.use_it(value_returned)
The Python docs say all that needs to be said, as far as I can see.
setattr
(object, name, value)This is the counterpart of
getattr()
. The arguments are an object, a string and an arbitrary value. The string may name an existing attribute or a new attribute. The function assigns the value to the attribute, provided the object allows it. For example,setattr(x, 'foobar', 123)
is equivalent tox.foobar = 123
.
If this isn't enough, explain what you don't understand.