在Python中使用setattr()
我正在找人解释如何使用的基础知识,而不是使用setattr()
。
我的问题出现了试图使用一个类方法/函数来返回数据,然后把它放在另一个方法/函数。 也许在这种情况下更简单的方法会好得多,但是我想了解类是如何工作/使用的。 这个问题似乎取决于setattr()
,这是我试图做一个相当简单的使用。
虽然这不是完全相同的问题,但是我遵循Python艰难的道路,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
使用它的名字寻找一个房子,所以你准备好尽快打电话给它,如果你找不到房子,你会find一个不同的地方 – getattr
存在一个“名字”,然后你去找它。 从一个function到另一个function的步骤作为奖励,你可能有一个默认值,有用的是一个后备默认方法 – 连接失败或什么?
setattr
build立一个房子,并给它一个名字,以便以后可以打电话给它。 你可能会重build这个房子,或者如果你找不到它,就去一个特定的地方。 – setattr
产生一个属性名称,并给出或改变它的值,稍后调用可能用户closures声音,然后未来的方法不输出任何audio。
我可以用很多方法写我的函数,但是不需要改变任何属性:
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)
您将self.name
设置为string "get_thing"
,而不是函数get_thing
。
如果你想self.name
是一个函数,那么你应该把它设置为一个:
setattr(self, 'name', self.get_thing)
但是,对于其他代码来说,这完全没有必要,因为您可以直接调用它:
value_returned = self.get_thing()
据我所知, Python文档中提到了所有需要说明的内容。
setattr
( 对象 , 名称 , 值 )这是
getattr()
的对应部分。 参数是一个对象,一个string和一个任意值。 该string可以命名现有的属性或新的属性。 该函数将该值赋给该属性,只要该对象允许。 例如,setattr(x, 'foobar', 123)
等同于x.foobar = 123
。
如果这还不够,请解释一下你不明白的地方。
Setattr:我们使用setattr为我们的类实例添加一个属性。 我们传递类实例,属性名称和值。 并与getattr我们retrive这些价值观
例如
Employee = type("Employee", (object,), dict()) employee = Employee() # Set salary to 1000 setattr(employee,"salary", 1000 ) # Get the Salary value = getattr(employee, "salary") print(value)
假设你想给以前没有写在代码中的实例赋予属性。 setattr()
就是这样做的。 它需要类self
的实例以及key和value来设置。
class Example: def __init__(self, **kwargs): for key, value in kwargs.items(): setattr(self, key, value)