Как связать функцию с объектом? - PullRequest
0 голосов
/ 09 февраля 2019

Рассмотрим этот код:

class SomeClass:
    def __init__(self, i):
        self.i = i

    def some_method(self):
        def returned_method(self, new_i):
            self.i = new_i
        return returned_method

some_obj = SomeClass(5)
some_obj.some_method()(6)
print(some_obj.i)

Это заканчивается исключением :

Traceback (most recent call last):
  File "./prog.py", line 11, in <module>
TypeError: returned_method() missing 1 required positional argument: 'new_i'

Очевидно, что метод, возвращаемый some_method, не связан.Он не получает some_obj в качестве первого аргумента.

Как связать returned_method в some_method с self?

1 Ответ

0 голосов
/ 09 февраля 2019

returned_method не метод;это обычная функция.Нет необходимости объявлять его как принимающий два аргумента.

def some_method(self):
    def _(new_i):
        self.i = new_i
    return _

_ (не нужно давать ему какое-либо конкретное имя) не нужно self в качестве аргумента, потому что это замыкание надаргумент, переданный some_method.

Используется так же, как и раньше:

some_obj = SomeClass(5)
some_obj.some_method()(6)
print(some_obj.i)
...