2011-10-07 20 views
3

我想用python閉包來做一些有點奇怪的事情(至少對我來說)。說我有2類這樣的:python closure + oop

#!/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 

我的問題是:是否有無法讓closure()方法訪問對象的屬性,方法?

感謝,

+1

@NullUserExceptionఠ_ఠ,是不是閉包功能閉包? –

回答

7

給內在的自我的另一個名字:

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

此外,而不是使用types.MethodType,你可能想使用functools.partial