Skip Montanaro wrote: >> Another round, this time with a metaclass. As you have found partial() >> does not work as a method because it's not a descriptor (i. e. no >> __get__() method). Instead you can try a closure: >> >> def make_method(a): >> underlying = getattr(SomeOtherClass, a) >> @functools.wraps(underlying) >> def _meth(self, *args, **kw): >> return underlying(self._instance, *args, **kw) >> return _meth >> >> class SomeMeta(type): >> def __new__(cls, name, parents, dct): >> for a in dir(SomeOtherClass): >> if a[0] == "_": continue >> dct[a] = make_method(a) >> return super(SomeMeta, cls).__new__(cls, name, parents, dct) > > Dang, Peter... That looks like it will do exactly what I need. Here's > help on SomeOtherClass with its one method: > > class SomeOtherClass(__builtin__.object) > | Methods defined here: > | > | meth1(self) > | meth1 doc > ... > > And, here's SomeClass (__metaclass__ = SomeMeta), which defines meth2, > but steals meth1 from SomeOtherClass: > > class SomeClass(__builtin__.object) > | Methods defined here: > | > | meth1(self, *args, **kw) > | meth1 doc > | > | meth2(self) > | meth2 doc > ... > > With a bit of introspection in make_method (or an extension of > functools.wraps), I can probably make SomeClass.meth1 have the same > signature as SomeOtherClass.meth1. > > Thx, > > Skip
In Python 3 you should see the correct signature, for Python 2 I think this addressed by Michele Simionato's https://pypi.python.org/pypi/decorator http://pythonhosted.org/decorator/documentation.html#id8 module. -- https://mail.python.org/mailman/listinfo/python-list