Как вызвать метод с помощью getattr? Я хочу создать метакласс, который может вызывать несуществующие методы другого класса, которые начинаются со слова «oposite_». Метод должен иметь одинаковое количество аргументов, но возвращать противоположный результат.Вызов метода с getattr в Python
def oposite(func):
return lambda s, *args, **kw: not oposite(s, *args, **kw)
class Negate(type):
def __getattr__(self, name):
if name.startswith('oposite_'):
return oposite(self.__getattr__(name[8:]))
def __init__(self,*args,**kwargs):
self.__getattr__ = Negate.__getattr__
class P(metaclass=Negate):
def yep(self):
return True
def maybe(self, sth):
return sth
Но проблема в том, что
self.__getattr__(sth)
возвращает объект NoneType.
>>> p = P()
>>> p.oposite_yep() #should be False
Traceback (most recent call last):
File "<pyshell#115>", line 1, in <module>
p.oposite_yep()
TypeError: <lambda>() takes at least 1 positional argument (0 given)
>>> p.oposite_maybe(False) #should be true
Как с этим бороться?
Для записи «oposite» пишется с двумя p. Но, как говорил мой коллега, «программистам не нужно правильно писать, они должны постоянно повторяться». – Seth