我有一个初学者问题。我想从一个实例中获取一个属性。当我使用带有2个separeted参数的getattr(对象和属性的名称)时,它工作正常。
但我读到可以只使用一个参数(如:obj.attr)。当我尝试它时,我得到一个错误:getattr预计至少有2个参数,得到1.为什么它不起作用?
class test :
def __init__ (self) :
self.name = "a"
inst = test()
print getattr (inst, "name")
print getattr (inst.name)
a
# Error: getattr expected at least 2 arguments, got 1
# Traceback (most recent call last):
# File "<maya console>", line 8, in <module>
# TypeError: getattr expected at least 2 arguments, got 1 #
答案 0 :(得分:2)
getattr()
可用于使用动态属性名称实现属性访问。如果您不知道属性名称预先,则使用它。
当您在代码中使用inst.name
时,您事先知道属性名称;你刚输入它,所以Python知道你在这里尝试使用属性名name
。 Python可以解析该表达式,当代码运行时,会在name
引用的对象上查找属性inst
,并且可以生成一个值。
但是如果你想使用一个变量,包含属性的名称,那么使用getattr()
是有道理的:
attribute_name = 'name'
attribute_value = getattr(inst, attribute_name)
此处getattr()
获取要查找属性的对象,以及表示要为您获取的属性的字符串。
你的错误在于你没有提供第二个参数。你给它一个对象作为第一个参数(inst.name
,在这种情况下是一个值为'a'
的字符串对象),但不是第二个参数。我怀疑你想在字符串'a'
上查找属性。你想要'a'
本身,你已经拥有了,所以你可以完全删除getattr()
函数调用:
getattr(inst, 'name') # returns 'a'
inst.name # also returns 'a'
答案 1 :(得分:0)
它不起作用,因为getattr expected at least 2 arguments
。
您也可以在没有getattr
的情况下获取您的属性:
>>> inst.name
'a'
因此无需使用getattr
!
getattr(对象,名称[,默认])
返回object的named属性的值。 name必须是一个字符串。如果字符串是对象属性之一的名称,则结果是该属性的值。例如,
getattr(x, 'foobar')
相当于x.foobar
。如果named属性不存在,则返回default(如果提供),否则引发AttributeError。