编程语言
首页 > 编程语言> > python – 类对象上的getattr

python – 类对象上的getattr

作者:互联网

class A:
    def foo(self):
        print "foo()"

getattr(A, foo) # True
A.foo() # error

getattr(A(), foo) # True
A().foo() # prints "foo()"

话虽这么说,这是我的问题:

我希望将测试用例元信息存储为Test Case类对象本身的属性,而不是它们的实例.
我有一个要提取的属性名称列表,但是如果有一个同名的实例方法,那么getattr(class_obj,attr)将返回True,但是getattr(class_obj,attr)()会引发一个Error.

有没有办法告诉getattr不要包含实例化类的属性,只包含类对象本身的属性?

编辑:我尝试直接访问class_obj .__ dict__(我理解这是不好的做法),但它不包括像__name__这样的属性

编辑:问题的改写.有没有办法区分类obj的方法和类的实例的方法?

解决方法:

这够好吗?

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

    def bar(self):
        print 'bar'

结合:

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

您也可以使用inspect模块:

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

通过一些额外的工作,您甚至可以将类方法与实例方法和静态方法区分开来:

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'

您可以将其用作:

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

标签:python,class-method,getattr
来源: https://codeday.me/bug/20190612/1228010.html