How To Dynamically Change Signatures Of Method In Subclass?
When using classmethod to dynamic change the method in subclass, how to dynamic change signatures of method? example import inspect class ModelBase(object): @classmethod
Solution 1:
If this is only for introspection purpose you could override __getattribute__
on ModelBase
and every time method_two
is accessed we return a function that has the signature of method_one
.
import inspect
defcopy_signature(frm, to):
defwrapper(*args, **kwargs):
return to(*args, **kwargs)
wrapper.__signature__ = inspect.signature(frm)
return wrapper
classModelBase(object):
@classmethoddefmethod_one(cls, *args):
raise NotImplementedError
@classmethoddefmethod_two(cls, *args):
return cls.method_one(*args) + 1def__getattribute__(self, attr):
value = object.__getattribute__(self, attr)
if attr == 'method_two':
value = copy_signature(frm=self.method_one, to=value)
return value
classSubClass(ModelBase):
@staticmethoddefmethod_one(a, b):
return a + b
classSubClass2(ModelBase):
@staticmethoddefmethod_one(a, b, c, *arg):
return a + b
Demo:
>>>test1 = SubClass()>>>print(inspect.signature(test1.method_two))
(a, b)
>>>test2 = SubClass2()>>>print(inspect.signature(test2.method_two))
(a, b, c, *arg)
Post a Comment for "How To Dynamically Change Signatures Of Method In Subclass?"