getattr() 函数如何与变量一起工作?

1 投票
2 回答
1410 浏览
提问于 2025-04-17 06:42

我最近在阅读《Dive Into Python》这本书,了解到getattr()这个函数。书里说它在处理模块时非常好用,这一点我没有疑问!我做了一些测试,但我不明白为什么在某段代码中使用getattr()和一个特定的变量时会出现问题:

var="lol"
a=getattr(var,"join")

a(["A","B","C"])   # output: 'AlolBlolC'

var="lll"
a(["A","B","C"])  #  output: 'AlolBlolC' - I thought It should have been 'AlllBlllC'

另一方面:

var.join(["A","B","C"])   # output:'AlllBlllC'

我不明白为什么在把变量'var'改成'111'后,它在引用'a'时不工作,但用变量名时却能正常工作。

2 个回答

0

根据我的理解,这跟 getattr 没什么关系。我们来看看

obj = "x"
meth = obj.join
print meth("ABC") # AxBxCx

obj = "y"
print meth("ABC") # AxBxCx

http://docs.python.org/tutorial/classes.html 上说

当你引用一个实例属性,但这个属性不是数据属性时,系统会去查找它的类。如果这个名字对应的确实是一个有效的类属性,并且它是一个函数对象,那么就会创建一个方法对象,这个方法对象是通过把实例对象和刚找到的函数对象一起打包成一个抽象对象来实现的:这就是方法对象。

换句话说,var=obj.someMethod 创建了一个闭包,这个闭包捕获了方法中的 self。正如之前所说,后面对这个变量的赋值不会影响这个闭包,因为它引用的是对象本身,而不是变量。

5

在Python中,把一个值赋给变量并不会改变这个变量所指向的对象。它只是把一个不同的对象赋给了这个变量。也就是说,当你调用getattr()的时候,a这个变量所持有的方法仍然和你之前提到的字符串var保持关联。

撰写回答