我确信在堆栈溢出的某个地方会有这个问题的答案,但是我一直找不到。它们中的大多数是关于将函数而不是方法作为函数的参数传递的。
我目前正在使用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'
我的印象是,我可以合法地将方法作为参数传递,并在以上述方式使用时正确评估它们。我想念什么?
这不是方法调用的工作方式。该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)
未绑定的方法在本教程中没有详细说明;有关绑定方法的部分将介绍它们。因此,您必须转到参考手册以获取文档(在[标准类型层次结构](https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy)中,小节“用户定义的方法”),对于新手来说可能有点令人生畏。
就我个人而言,直到我了解了它的工作原理后,我才真正了解到它。大约一年前,我写了一篇博客文章方法是如何工作的,试图向其他人解释它(但是在Python 3.x术语中,这略有不同)。它可能会有所帮助。要真正获得它,您必须通读Descriptor HOWTO,它可能需要一些通读和交互式解释器中的许多操作才能真正被点击,但是希望您能够在进入之前理解方法背后的基本概念。那一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句