所以我知道在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
也会通过?
答案 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
参数)。