Python:将方法作为函数参数传递时的属性错误

时间:2014-08-27 08:24:15

标签: python oop python-2.7 functional-programming

我确信在堆栈溢出的某个地方可以找到这个问题的答案,但我还没能找到一个;其中大多数是关于传递函数而不是方法,作为函数的参数。

我目前正在使用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'

我的印象是,我可以合法地将方法作为参数传递,并在以上述方式使用时正确评估它们。我错过了什么?

2 个答案:

答案 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)()