python方法作为参数
所以我知道在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
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的实例。