class Negate(type):
def __getattr__(self, name):
if name.startswith('oposite_'):
def oposite(*args,**kwargs):
return not getattr(self,name[8:])(*args,**kwargs)
return oposite
else:
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, name))
def __init__(self,*args,**kwargs):
self.__getattr__ = Negate.__getattr__
class P(metaclass=Negate):
def yep(self):
return True
def same(self,x,y):
return x==y
p=P()
print(p.oposite_yep())
# False
print(p.oposite_same(1,2))
# True
print(p.nope())
Кстати, вы также можете сделать это с декоратором класса вместо метакласса:
def Negater(cls):
def __getattr__(self, name):
if name.startswith('oposite_'):
def oposite(*args,**kwargs):
return not getattr(self,name[8:])(*args,**kwargs)
return oposite
else:
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, name))
setattr(cls,'__getattr__',__getattr__)
return cls
@Negater
class P():
....