Функции и методы могут быть непростыми в использовании.Хорошее практическое правило: если вам нужен метод, сохраняйте его в классе.
Когда вам нужно это будет метод?Когда код обращается к частям экземпляра или класса.
В вашем простом примере код замены не обращается к экземпляру, и поэтому вы можете оставить ему функцию в экземпляре, например, так:
test.a = lambda: "hola"
и вот пример, который делает доступэкземпляр с кодом, хранящимся в классе (что обычно требуется):
x.c = lambda self: self.b().upper()
или сохраненный в экземпляре:
# using MethodType
import types
test.c = types.MethodType((lambda self: self.b().upper()), test)
# using partial
import functools
test.c = functools.partial((lambda self: self.b().upper()), test)
# just using the instance name, as Ryan did
test.c = lambda: test.some_attribute
Пока последний метод будет работатьБольшую часть времени у него есть одна ловушка:
oops = test
del oops
oops.c()
Traceback (most recent call last):
File "test.py", line 42, in <module>
oops.c()
File "test.py", line 38, in <lambda>
test.c = lambda: test.some_attribute
NameError: global name 'test' is not defined
Просто что-то, что нужно иметь в виду.