1

可能重复:
检查 python 类属性

我需要得到一个干净的列表,列出我在一个类中定义的所有属性的名称。假设我有下一节课:

class MyClass(object):
    attr1 = None
    attr2 = 2
    attr3 = "Hello world"

我想知道是否有什么可以让我做的事情:

>>> some_method(MyClass)  # <- check class
['attr1', 'attr2', 'attr3']
>>> my_class = MyClass()
>>> some_method(my_class)  # <- check instance of MyClass
['attr1', 'attr2', 'attr3']

我不能依赖内置方法dir,因为它还返回属性,如__class__,__getattr__以及该类具有的任何方法。我的意思是,我只需要获取类中定义的属性,而不是内置属性,也不需要方法。

这甚至可能吗?或者有什么方法可以知道哪些属性是内置的,哪些是我定义的,以便我可以遍历列表dir返回并进行一些操作filter

提前感谢您的帮助!!

4

4 回答 4

5

这是一个起点:

>>> [x for x in dir(a) if not x in dir(super(type(a)))]
['__dict__', '__module__', '__weakref__', 'attr1', 'attr2', 'attr3']

返回对象dir中不是来自其父类的所有内容dir

它做得好的一件事是过滤掉类中定义的方法,但不涉及碰巧是函数的实例属性。

于 2012-11-22T18:03:03.263 回答
2

函数也是属性,没有什么能阻止您在以后将附加函数分配给类或实例。所以你问你是否可以列出所有不是函数的属性,而不是“特殊”。

如果要列出直接在类或实例上定义的任何内容,请查看.__dict__映射。您仍然需要过滤:

import types

def objectAttributes(obj):
    for key, val in obj.__dict__.iteritems():
        if not isinstance(val, (types.FunctionType, types.MethodType)):
            yield key

这将生成所有不是函数或方法的属性名称,它们应该适用于类和手动分配给它们的方法的实例。

要获取列表作为输出,请调用list(objectAttributes(MyClass))list(objectAttributes(myinstance))

这个方法不遍历__slots__基类,如果你在你的类上使用就会失败。

于 2012-11-22T18:02:03.517 回答
2

您可以使用检查模块来执行此操作。

这是一个例子:

>>> import inspect
>>> filter(lambda x: not (x.startswith('__') and x.endswith('__')), [a for (a, b) in inspect.getmembers(MyClass, lambda x : (not inspect.ismethod(x) and not inspect.isbuiltin(x)) )])
['attr1', 'attr2', 'attr3']

基本思想是运行inspect.getmembers以获取某个对象的所有成员。这支持对象和类。使用作为可选参数提供的谓词 lambda 表达式过滤方法和内置函数inspect.getmembers。然后,列表推导用于获取每个成员的名称,最后__dict__使用 Python 过滤器函数过滤掉 etc。

过滤__dict__等不是很“科学”,但我认为它应该适用于大多数情况:)

于 2012-11-22T18:13:59.840 回答
0
t = MyClass()
result = []
for k,v in t.__dict__.items(): #all members of MyClass
    if not hasattr(v, '__call__'):#if it's not  a callable 
        result.append(k)
于 2012-11-22T18:03:57.923 回答