getattr on class objects

class-method, getattr, python

Solution

Is this good enough?

import types
class Test(object):
    @staticmethod
    def foo():
        print 'foo'

    def bar(self):
        print 'bar'

In combination with:

>>>(isinstance(getattr(Test, 'foo'), types.FunctionType),
    isinstance(getattr(Test, 'bar'), types.FunctionType))
True, False

You can also use the `inspect` module:

>>> inspect.isfunction(Test.foo)
True
>>> inspect.isfunction(Test.bar)
False

With a little additional work you can even distinguish class methods from instance methods and static methods:

import inspect

def get_type(cls, attr):
    try:
        return [a.kind for a in inspect.classify_class_attrs(cls) if a.name == attr][0]
    except IndexError:
        return None

class Test(object):
    @classmethod
    def foo(cls):
        print 'foo'

    def bar(self):
        print 'bar'

    @staticmethod
    def baz():
        print 'baz'

You can use it as:

>>> get_type(Test, 'foo')
'class method'
>>> get_type(Test, 'bar')
'method'
>>> get_type(Test, 'baz')
'static method'
>>> get_type(Test, 'nonexistant')
None

Problem

``` class A: def foo(self): print "foo()" getattr(A, foo) # True A.foo() # error getattr(A(), foo) # True A().foo() # prints "foo()" ``` That being said, here is my problem: I wish to store test case meta information as attributes of the Test Case class objects themselves, not on instances of them. I have a list of attribute names to extract, but if there is an instance method of the same name, then `getattr(class_obj, attr)` will return True, but `getattr(class_obj, attr)()` raises an Error. Is there a way to tell getattr not to include attributes of the instantiated class and only of the class object itself? EDIT: I tried accessing `class_obj.__dict__` directly (which I understand is bad practice), but it does not include some attributes like `__name__` EDIT: Rephrase of the question. Is there a way to differentiate between methods of the class obj and the methods of an instance of the class?

Original source