Steve Holden wrote: > [EMAIL PROTECTED] wrote: >> Hi, >> >> I am writing a library in which I need to find the names of methods >> which are implemented in a class, rather than inherited from another >> class. To explain more, and to find if there is another way of doing >> it, here is what I want to do: I am defining two classes, say A and B, >> as: >> >> class A(object): >> def list_cmds(self): >> 'implementation needed' >> ? >> def __init__(self): >> ... (rest of class) >> >> class B(A): >> def cmd1(self, args): >> pass >> def cmd2(self, args): >> pass >> >> I need an implementation of list_cmds in A above so that I can get a >> result: >> >> >>>>> b=B() >>>>> b.list_cmds() >> >> ['cmd1','cmd2'] #order not important >> >> I will be happy if anybody can point to me any way of doing it, using >> class attributes, metaclasses or otherwise. What I don't want to do is >> modifying class B, which contains just the cmds, if possible. >> >> Many thanks in advance. >> > $ cat test01.py > class A(object): > def list_cmds(self): > """return callable attributes from > subclasses not present in main class.""" > Amethods = [m for m in dir(A) if callable(getattr(A, m))] > return [m for m in dir(self.__class__) > if callable(getattr(self.__class__, m)) > and m not in Amethods] > def __init__(self): > pass > > class B(A): > def cmd1(self, args): > pass > def cmd2(self, args): > pass > > print "A additionals:", A().list_cmds() > print "B additionals:", B().list_cmds() > > > [EMAIL PROTECTED] ~ > $ python test01.py > A additionals: [] > B additionals: ['cmd1', 'cmd2'] > > [EMAIL PROTECTED] ~ > $ > > Hope this helps. > > regards > Steve
You don't really want to use dir(A), since this will not pick up all the classes that make up A. Don't you want to use the MRO instead? Chaz -- http://mail.python.org/mailman/listinfo/python-list