我正在寻找有人解释如何使用的基本知识,而不是使用setattr().
我的问题出现了尝试使用一个类方法/函数来返回数据然后放入另一个方法/函数.在这种情况下,也许更简单的方法会好得多,但我试图理解类的工作原理.这个问题似乎取决于此问题setattr(),这是我试图对此进行相当简单的使用.
虽然它是不太一样的问题,我在下面的Python困难的方法,ex42 -the 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()
Run Code Online (Sandbox Code Playgroud)
@ 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)
Run Code Online (Sandbox Code Playgroud)
正确更正的代码:
def run_it(self):
value_returned = self.get_thing()
self.use_it(value_returned)
Run Code Online (Sandbox Code Playgroud)
Chr*_*gan 76
在Python文档说所有需要说的,据我所看到的.
setattr(对象,名称,值)这是对应的
getattr().参数是一个对象,一个字符串和一个任意值.该字符串可以命名现有属性或新属性.如果对象允许,该函数会将值分配给属性.例如,setattr(x, 'foobar', 123)相当于x.foobar = 123.
如果这还不够,请解释一下你不理解的内容.
Amb*_*ber 64
要设置self.name的字符串 "get_thing",而不是功能get_thing.
如果你想self.name成为一个函数,那么你应该把它设置为一个:
setattr(self, 'name', self.get_thing)
Run Code Online (Sandbox Code Playgroud)
但是,这对您的其他代码完全没有必要,因为您可以直接调用它:
value_returned = self.get_thing()
Run Code Online (Sandbox Code Playgroud)
小智 11
Setattr: 我们使用setattr为我们的类实例添加一个属性.我们传递类实例,属性名称和值.并使用getattr我们检索这些值
例如
Employee = type("Employee", (object,), dict())
employee = Employee()
# Set salary to 1000
setattr(employee,"salary", 1000 )
# Get the Salary
value = getattr(employee, "salary")
print(value)
Run Code Online (Sandbox Code Playgroud)
为了添加其他答案,我发现的一个常见用例setattr()是使用配置时。将文件(.ini 文件或其他文件)中的配置解析到字典中是很常见的。所以你最终会得到类似的结果:
configs = {'memory': 2.5, 'colour': 'red', 'charge': 0, ... }
Run Code Online (Sandbox Code Playgroud)
如果您想将这些配置分配给一个要存储和传递的类,您可以进行简单的分配:
MyClass.memory = configs['memory']
MyClass.colour = configs['colour']
MyClass.charge = configs['charge']
...
Run Code Online (Sandbox Code Playgroud)
但是,循环配置要容易得多且不那么冗长,setattr()如下所示:
for name, val in configs.items():
setattr(MyClass, name, val)
Run Code Online (Sandbox Code Playgroud)
只要你的字典键有正确的名称,这个方法就可以很好地工作,而且美观整洁。
*注意,字典键必须是字符串,因为它们将是类对象名称。
小智 5
假设您想要为以前未用代码编写的实例赋予属性。就是setattr()这么做的。它需要类的实例self以及要设置的键和值。
class Example:
def __init__(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
Run Code Online (Sandbox Code Playgroud)