закрытие питона + опа - PullRequest
       7

закрытие питона + опа

3 голосов
/ 08 октября 2011

Я пытаюсь сделать что-то немного странное (по крайней мере для меня) с закрытием Python. Скажем, у меня есть 2 класса, как это:

#!/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 () доступ к атрибуту, методу объекта a?

Спасибо

1 Ответ

7 голосов
/ 08 октября 2011

Дайте внутреннему я другое имя:

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

Кроме того, вместо использования types.MethodType, вы можете использовать functools.partial

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...