Python 闭包 + 面向对象编程

3 投票
1 回答
1547 浏览
提问于 2025-04-17 03:54

我正在尝试用 Python 的闭包做一些我觉得有点奇怪的事情。假设我有两个类,像这样:

#!/usr/bin/python
import types

def method_a(self):
    print "ma %d" % self.val

class A(object):
    def __init__(self):
        self.val = 5
        pass

    def foo(self, a):
        def closure(self):
            print "closure %d, %d" % (self.val, a)
        return closure

class B(object):
    def __init__(self):
        self.val = 10
        pass

    def foo(self):
        print "B::foo %d"  % self.val


a = A()
b = B()
b.undo = types.MethodType(a.foo(1), b)

b.undo()

所以,对象 a 的方法返回一个闭包,这个闭包会被对象 b 使用,并且这个闭包函数会绑定到对象 b 上,像上面的代码那样会得到:

closure 10, 1

我的问题是:有没有办法让这个闭包方法访问对象 a 的属性和方法呢?

谢谢,

1 个回答

7

给内部的自我起个别名:

def foo(self, a):
    def closuer(b):
        print "closure %d, %d" % (self.val, a)
    return closuer

另外,与其使用 types.MethodType,不如试试 functools.partial。

撰写回答