python方法作为参数

时间:2011-08-18 12:35:33

标签: python

所以我知道在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也会通过?

4 个答案:

答案 0 :(得分:8)

当您访问a.my_method时,Python发现它是该类的一个属性,并且A.my_method有一个方法__get__(),因此它调用A.my_method.__get__(a),该方法会创建一个新的object('bound method'),包含对A.my_method的引用和对a本身的引用。当您调用绑定方法时,它会将回调传递回基础方法。

每次调用任何方法时都会发生这种情况,无论是直接调用还是在代码中,都会将实际调用延迟到以后。您可以在http://docs.python.org/reference/datamodel.html#descriptors

中找到描述符协议的更多描述

答案 1 :(得分:4)

  

这个方法到底是怎么回事?

这很容易回答:在Python中,一切都是对象:)还有函数/方法,它们是特定的函数对象,可以作为参数传递。

  

在这种情况下,当我传递a.my_method时,实例a也会被传递?

是的,在这种情况下,实例a也会被传递,但是嵌入在函数对象中并且无法检索。相反,您可以传递函数本身并为其提供实例。请考虑以下示例:

b = B()
func = A.my_method # Attention, UPPERCASE A
func(b)

这会调用A类方法my_method,其实例为B

答案 2 :(得分:1)

函数是Python中的“第一类对象”。这意味着函数是一个对象,就像一个列表或一个整数。定义函数时,实际上是将函数对象绑定到def中使用的名称。

函数可以绑定到其他名称或作为参数传递给函数(或存储在列表中,或者......)。

来源:http://mail.python.org/pipermail/tutor/2005-October/042616.html

答案 3 :(得分:1)

a.my_method不完全返回您在class A中定义的函数(可以通过A.my_method获得),而是一个名为'bound method'的对象,它包含两个原始函数(或Python 2中的“未绑定方法”,IIRC)以及检索它的对象(self参数)。