我确信在堆栈溢出的某个地方可以找到这个问题的答案,但我还没能找到一个;其中大多数是关于传递函数而不是方法,作为函数的参数。
我目前正在使用Python 2.7.5,而我正在尝试定义这样的函数:
def func(object, method):
object.method()
当这样调用时:
some_object_instance = SomeObject()
func(some_object_instance, SomeObject.some_object_method)
使用如下定义的类:
class SomeObject:
def some_object_method(self):
# do something
基本上相当于这样做:
some_object_instance.some_object_method()
但是,我不断收到属性错误 - 这与
'SomeObject' has no attribute 'method'
我的印象是,我可以合法地将方法作为参数传递,并在以上述方式使用时正确评估它们。我错过了什么?
答案 0 :(得分:2)
这不是方法调用的方式。 foo.bar
语法在bar
对象上查找名为 foo
的方法。如果您已经拥有该方法,请调用它:
def func(object, method):
method(object)
func(some_object_instance, SomeObject.some_object_method)
SomeObject.some_object_method
是所谓的“未绑定方法”:它是一个没有绑定self
的方法对象,因此您必须明确地将self
传递给它。
通过一个具体的例子,这可能更有意义:
>>> s = 'ABC'
>>> s_lower = s.lower # bound method
>>> s_lower()
'abc'
>>> str_lower = str.lower # unbound method
>>> str_lower(s)
'abc'
相比之下,some_object_instance.some_object_method
是一个“绑定方法”,您可以按原样调用它,some_object_instance
已经“绑定”为self
参数:
def func2(method):
method()
func2(some_object_instance.some_object_method)
本教程不详细解释未绑定方法;它们在bound methods的部分中有所涉及。因此,您必须转到文档的参考手册(在[标准类型层次结构](https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy)中,在“用户定义的方法”小节中向下,这对新手来说可能有点令人生畏。 / p>
就个人而言,直到我了解它是如何运作的,我才真正得到这个。大约一年前,我写了一篇博客文章How methods work,试图向其他人解释(但在Python 3.x术语中,略有不同);它可能有所帮助。为了真的得到它,你必须通过Descriptor HOWTO,这可能需要一些阅读和很多在交互式解释器中玩之后才真正点击,但希望你在达到这一点之前,我们可以理解方法背后的基本概念。
答案 1 :(得分:0)
由于您将未绑定的方法传递给该函数,因此需要将其称为:
method(object)
或者更好地将方法的名称作为字符串传递,然后使用getattr
:
getattr(object, method)()