Закрытие класса Python: как оно называется? - PullRequest
0 голосов
/ 03 мая 2018

Я знаю функции высокого порядка и замыкание, которое создается с помощью функции return. В большинстве случаев я нахожу это полезным и повторяю его. Мой вопрос здесь связан с замыканием, которое создается с определением класса и со ссылкой на функцию экземпляра класса, возвращаемую из вызова функции. Может ли это быть классифицировано как обычное закрытие или это что-то еще из литературы по Python (или программированию)? Вот пример:

class Klass:
    def __init__(self, val):
        self.val = val
    def ret_val(self):
        return self.val


def gen_val_fn(val):
    inst = Klass(val)
    return inst.ret_val

fn5 = gen_val_fn(5)
fn6 = gen_val_fn(6)

print("first: {}".format(fn5()))
print("second: {}".format(fn6()))

Как здесь работают внутренние органы? Мое предположение здесь заключается в том, что после вызова gen_val_fn(5) создается первый экземпляр Klass, и он не является сборщиком мусора, пока fn5 не будет сборщиком мусора. Таким образом, он может создавать val=5 как замыкание (я не уверен, что это может быть правильной терминологией). Есть ли какие-либо документы или внутренние знания, которые вы можете указать на это? Или объясните, если в этом объяснении есть недостатки.

Спасибо!

1 Ответ

0 голосов
/ 03 мая 2018

Это называется связанным методом.

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

В вашем примере попробуйте это:

>>> fn5
<bound method Klass.ret_val of <__main__.Klass object at 0x006B1270>>
>>> fn5.__self__
<__main__.Klass object at 0x006B1270>
>>> fn5.__self__.val
5

Тогда вызов fn5() аналогичен вызову fn5.__func__(fn5.__self__).

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