getattr を使用してメソッドを呼び出す方法は? 「oposite_」という単語で始まる他のクラスの存在しないメソッドを呼び出すことができるメタクラスを作成したいと考えています。メソッドは同じ数の引数を持つ必要がありますが、反対の結果を返す必要があります。
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
これに対処する方法は?