在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的步骤作为奖励,你可能有一个默认值,有用的是一个后备默认方法 – 连接失败或什么?

setattrbuild立一个房子,并给它一个名字,以便以后可以打电话给它。 你可能会重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)