Я думаю, что основная идея здесь верна, с парой небольших исправлений. Во-первых,
A.f = A.h # redefines instance method 'f' to print 'h'
Это должно читать class метод, а не метод экземпляра. Вы меняете класс здесь. И во-вторых, это не соответствует какой-либо определенной переменной здесь:
if cache is None:
Я думаю, может быть, вы имеете в виду cache_field
?
Как правило, установка атрибутов экземпляра в __init__
является совершенно нормальной и приемлемой. Неважно, что это метод, а не какой-то другой объект - он ничем не отличается от высказывания self.foo = 'bar'
.
Кроме того, иногда это зависит, но в общем случае действительно быстрее установить метод в init
, чем проверять cache_field
каждый раз, когда вызывается check_cache
.