python - 为什么Python的指向随着这个函数的微小改变而改变?

标签 python class methods attr

在使用 python 时,令我困扰的是,虽然 obj.method() 完全没问题,但 method(obj) 是不允许的。所以我想我应该尝试编写一些代码来解决这个问题。我想出了下一个:

def globalclassfuncs(defobj):
  for i in inspect.getmembers(defobj, predicate=inspect.ismethod):
    def scope():
      var = i[0];
      setattr(sys.modules[__name__], i[0], lambda obj, *args: getattr(obj, var)(*args));
    scope();

但是,这有一些奇怪的地方。当我删除def scope():时和scope() ,这样它就可以在 for 循环中没有函数定义的情况下运行,或者当我更改 getattr() 时使用函数i[0]直接而不是通过 var ,不知何故,所有新定义的函数都指向最后定义的函数,而不是它们应该指向的函数。为什么代码中如此小的更改会导致这种行为发生如此大的变化?

最佳答案

看起来像 late binding closure 的情况

关于python - 为什么Python的指向随着这个函数的微小改变而改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25000394/

相关文章:

ios - (Swift) 如何从不同的类中引用一个对象的属性?

java - 如何使用线程运行类的方法

python - 为什么同一类的两个实例会发生相同的实例变量更改?

python - 将 TFIDF 特征向量从 sklearn 传递到 SGDClassifier

python - Elasticsearch Python从JSON创建别名

javascript - (为什么)使用类似 jQuery 的选择器并执行其中一个方法比查找命名函数更快?

java - 在 Java 中通过构造函数传递一个对象?

如果找不到匹配项,Python 2.7 将退出一个只有一行的 while 循环

python - Tk 窗口返回 AttributeError : __len__

java - 什么更快 : passing an array to a class and doing a for each loop, 或在类上为每个循环做一个