lordwader
Реализовать простой класс с несколькими методами. При вызове метода которого не существует он должен быть создан на лету и вызван. В качестве результата вызова - имя метода.
это должен быть метод класаа или инстанса?
lordwader
__call__ и __getattribute__ перехватывают все методы и не вызывают minus и sum. Подскажите пожалуйста, где я ошибся в коде.
во первых __call__ вообще не учавствует там никак, он сработает только если сделать f().
__getattribute__ я бы не трогал, лучше переопредели __getattr__ тогда он будет перехватывать только непределенные атрибуты.
както так, в конкретной реализации оно добавляет методы в инстанс, легко переделывается чтобы добавляло методы в класс.
class Foo(object):
def sum(self, arg = 0):
print('summm!!!')
def minus(self, arg = 0):
print('minus!!!')
def make_method(self, name):
print('creating func:', name)
def _method():
print(name)
_method.__name__ = name
setattr(self, name, _method)
def __getattr__(self, key):
try:
res = super().__getattribute__(key)
except AttributeError:
self.make_method(key)
res = self.__getattribute__(key)
return res
f = Foo()
f.sum()
f.minus()
f.bar()
f.ber()
f.bar()
f.bar_1()
f.sum()
print(f.__dict__)
вывод:
>>>
>>>
summm!!!
minus!!!
creating func: bar
bar
creating func: ber
ber
bar
creating func: bar_1
bar_1
summm!!!
{'ber': <function ber at 0x02EE6540>, 'bar_1': <function bar_1 at 0x02EE6618>, 'bar': <function bar at 0x02EE64B0>}
>>>
>>>