Can ask a class for its functions?
altis at semi-retired.com
Thu Aug 15 17:50:30 CEST 2002
"Troy Melhase" <troy at gci.net> wrote in message
news:ulm3d0envo0mbe at corp.supernews.com...
> Or more list-comprehension-ly?
> [x for x in clazz.__dict__.values() if callable(x)]
This almost works except that it only gives you the methods defined in the
class, it doesn't include methods from any of the superclasses.
>>> class A:
... a = 'hello'
... def aMethod(self):
... print a
>>> [x for x in A.__dict__.values() if callable(x)]
[<function aMethod at 0x0156D8C0>]
>>> class B(A):
... b = 'world'
... def bMethod(self):
... print b
>>> [x for x in B.__dict__.values() if callable(x)]
[<function bMethod at 0x0156AD78>]
The first use of filter Peter provides below does appear to work correctly,
picking up superclass methods.
>>> filter(callable, [getattr(B, attr) for attr in dir(B)])
[<unbound method B.aMethod>, <unbound method B.bMethod>]
It looks like you can also use that on an instance of a class. I wonder
whether these results are Python 2.2.x specific? PythonCard has been using
an elaborate method to recurse over an instance variable using __bases__ and
it would be nice to replace that.
> Peter Hansen wrote:
> > Troy Melhase wrote:
> >> This doesn't work because dir() returns a list of strings, none of
> >> are callable.
> >> What you meant was:
> >> filter(callable, [getattr(class_, attr) for attr in
> > Or more simply?
> > filter(callable, clazz.__dict__.values())
> > -Peter
> Troy Melhase
> mailto:troy at gci.net
More information about the Python-list