python方法作为参数

python方法作为参数,python,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_meth

所以我知道在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)
b = B()
func = A.my_method # Attention, UPPERCASE A
func(b)
首先写这篇文章只是为了看看事情是如何运作的。例如,我知道我应该检查
我的\u方法
的参数是否可调用。现在我的问题是:

这里的方法到底是如何传递的?我的意思是我收到的输出是“a”,所以我猜当一个对象方法作为参数传递时,实际的对象也是?在这种情况下,当我传递
a.my_method
时,实例
a
也被传递

这里的方法到底是如何传递的

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

在这种情况下,当我传递a.my_方法时,实例a也会被传递吗

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

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)
b = B()
func = A.my_method # Attention, UPPERCASE A
func(b)

当您访问
A时,这将调用
A
classes方法
my\u方法
,实例为
B
。my\u方法
Python看到它是类的一个属性,并且
A.my\u方法有一个方法
\u get\u()
,因此它调用
A.my\u方法。
,该方法创建了一个新对象(“绑定方法”),其中既包含对
a.my_method
的引用,也包含对
a
本身的引用。调用绑定方法时,它会将调用传递回底层方法


每次调用任何方法时都会发生这种情况,无论是直接调用,还是在代码中,将实际调用延迟到以后。您可以在

中找到描述符协议的更多描述,函数是Python中的“一流对象”。这意味着函数既是一个对象,又是一个列表或整数。定义函数时,实际上是将函数对象绑定到def中使用的名称

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


源代码:

a.my_方法
返回的函数并不完全是您在
类a
中定义的函数(您可以通过
a.my_方法
获得它),而是一个名为“绑定方法”的对象,它包含原始函数(或Python 2中的“unbound方法”,IIRC)和从中检索它的对象(
self
参数)。

如果您正在使用Python 2,请使用
class A(object):
而不是
class A:
来获取“新样式的类”通常哪一个更好,以及您应该使用哪一个。感谢您的输入。在您习惯之前,Python可能会比较棘手:严格地说,A.my_方法不是函数本身,而是一个未绑定的方法对象。A.my_方法是一个绑定的方法对象。如果确实需要,您可以从A.my_方法检索A实例和原始函数确实需要(检查模块),但我看不出有什么理由在这里这样做。我尝试了您的建议,但唯一有效的方法是a.my_方法是一个具有obj参数的静态方法。否则它需要一个a的实例。