我正在寻求有人解释如何使用以及不使用 setattr()
的基础知识。
我的问题是在尝试使用一个类方法/函数返回数据后,将其放入另一个方法/函数中。也许在这种情况下更简单的方法会更好,但我正在尝试了解类的工作原理/用法。这个问题似乎取决于 setattr()
,而这是我尝试对其进行相当简单的使用。
虽然问题不完全相同,但我正在遵循Python The Hard Way, ex42 -第18-41行的while
循环。
我尝试编写一个 \__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的帮助。
我现在可以解释我的答案了!这需要我更好地掌握自我作为对象的理解。它是一个实例名称,附带一些属性。
该类可以是Town,然后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)
setattr
用于那些无法直接完成的情况。对于初学者来说,这些情况应该是不存在的。setattr(self, 'name', 'get_thing')
的意思与self.name = 'get_thing'
完全相同。 - Karl Knechtel__doc__
属性)中的字符串。 - Chris Morgan