Python:绑定方法和非绑定方法

1,绑定方法(bound method):绑定方法是可调用对象,它封装了函数(方法)和一个相关实例。

相关代码如下:

import types


class Foo(object):
    def __init__(self, value):
        self.value = value

    def instance_method(self, value):
        self.value = value

    def show_value(self):
        print(self.value)


if __name__ == '__main__':
    foo = Foo(10)
    meth = foo.instance_method
    # 由于封装了实例对象和方法,所以调用时候只需要传递第二个参数即可。
    meth(100)
    foo.show_value()
    # 绑定方法的类型是types.MethodType可调用对象。
    if isinstance(meth, types.MethodType):
        print('meth is types.MethodType!')

结果如下:

100
meth is types.MethodType!

2,非绑定方法(unbound method):非绑定方法是封装了方法函数的可调用对象,但需要传递一个”正确”类型的实例作为第一个参数。

(注:这里所说的正确类型并非一定是封装方法所在的类型,因为Python支持鸭子类型(duck type, ”如果它走路像鸭子,叫起来像鸭子,那它就一定是鸭子”,即Python是依据行为来判断类型的),只要行为一致,即可判定类型正确。

非绑定方法的例子如下:

import types


class Foo(object):
    def __init__(self, value):
        self.value = value

    def instance_method(self, value):
        self.value = value

    def show_value(self):
        print(self.value)


class Bar(object):
    def __init__(self, value):
        self.value = value

    def show_value(self):
        print(self.value)


if __name__ == '__main__':
    umeth = Foo.instance_method
    f = Foo(10)
    # 由于非绑定函数只是封装了函数方法,所以需要传递实例对象和其它参数。
    umeth(f, 100)
    f.show_value()

    # 非绑定方法的对象类型是types.functionType。
    if isinstance(umeth, types.FunctionType):
        print('umeth is types.FunctionType!')

    
    b = Bar(1)
    # 实例对象b是"正确"类型(如鸭子类型所述)。另外,非绑定方法可以理解为普通函数对象。
    umeth(b, 1000)
    b.show_value()

结果如下:

100
umeth is types.FunctionType!
1000

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注