所以我知道在python中,所有东西都是一个“对象”,这意味着它可以作为参数传递给一个方法。但我想弄明白这到底是怎么回事。所以我尝试了下面的例子:
class A:
    def __init__(self):
        self.value = 'a'
    def my_method(self)
        print self.value
class B:
   def __init__(self):
       self.values = 'b'
   def my_method(self, method):
       method()
a = A()
b = B()
b.my_method(a.my_method)首先,写这篇文章只是为了看看它是如何工作的。例如,我知道我应该检查my_method的参数是否是可调用的。
这里的方法到底是如何传递的呢?我的意思是,我收到的输出是'a‘,所以我猜,当一个对象方法作为参数传递时,实际的对象也是这样吗?在这种情况下,当我传递a.my_method时,实例a也被传递了吗?
发布于 2011-08-18 20:43:02
当您访问a.my_method时,Python看到它是类的属性,并且A.my_method有一个方法__get__(),因此它调用A.my_method.__get__(a),该方法创建一个新对象(“绑定方法”),其中既包含对A.my_method的引用,也包含对a本身的引用。当您调用绑定方法时,它会将调用传递回基础方法。
每次调用任何方法时都会发生这种情况,无论是直接调用它,还是像在代码中一样,将实际调用延迟到以后。您可以在http://docs.python.org/reference/datamodel.html#descriptors上找到有关描述符协议的更多描述
发布于 2011-08-18 20:42:31
这里传递的方法到底是怎么回事?
这很容易回答:在Python中,一切都是对象:)也是函数/方法,它们是特定的函数对象,可以作为参数传递。
在这种情况下,当我传递a.my_method时,实例a也被传递了吗?
是的,在这种情况下,也会传递实例a,尽管它嵌入在function对象中并且无法检索。相反,您可以传递函数本身并为其提供一个实例。考虑以下示例:
b = B()
func = A.my_method # Attention, UPPERCASE A
func(b)这将使用B的实例调用A类方法my_method。
发布于 2011-08-18 20:45:55
在Python中,函数是“第一类对象”。这意味着函数既是一个对象,也是一个列表或整数。定义函数时,实际上是将函数对象绑定到在def中使用的名称。
函数可以绑定到其他名称或作为参数传递给函数(或存储在列表中,等等)。
来源:http://mail.python.org/pipermail/tutor/2005-October/042616.html
https://stackoverflow.com/questions/7107510
复制相似问题