获取没有方法和内置函数的类的类和对象属性

时间:2011-11-15 13:58:18

标签: python introspection

说我有这个班:

class MyClass(object):
  my_attrib = 'foo'
  my_other_attrib = 'bar'

  def mymethod():
    pass

现在我怎样才能获得MyClass类,WITHOUT方法和内置函数__dict__等等的属性?

我希望在应用于上述课程时获得类似{'my_attrib':'foo', 'my_other_attrib':'bar'}的字典。

4 个答案:

答案 0 :(得分:7)

您可以从__dict__

过滤掉您不需要的所有内容
def getAttributes(clazz):
    return {name: attr for name, attr in clazz.__dict__.items()
            if not name.startswith("__") 
            and not callable(attr)
            and not type(attr) is staticmethod}

编辑:对于类属性和描述符,行为略有不同的替代方法:

def getAttributes2(clazz):
    attrs = {}
    for name in vars(clazz):
        if name.startswith("__"):
            continue
        attr = getattr(clazz, name)
        if callable(attr):
            continue
        attrs[name] = attr
    return attrs

(实际上,这应该与第一个版本很少不同。)

答案 1 :(得分:3)

这应该让你接近:

import inspect

class MyClass(object):
  my_attrib = 'foo'
  my_other_attrib = 'bar'

  def mymethod():
    pass

for name, value in inspect.getmembers(MyClass):
    if not inspect.ismethod(value) and not name.startswith('__'):
        print name

输出:

my_attrib
my_other_attrib

注意 - 可能有更好/更官方的方法来做到这一点,但这应该指向正确的方向。

答案 2 :(得分:2)

__dict__为您提供了所有这些,但您可以使用C扩展名来获得您想要的内容。不知道为什么你会这样做。

您可以使用typesdoc)来区分__dict__的成员。

答案 3 :(得分:1)

您可以使用内置的dir()来获取所有内容,然后进行过滤。您将不需要inspect模块。

def get_attrs_without_methods(klass):
    attrs = dir(klass)
    d = {}
    for x in attrs:
        if x.startswith('__'): continue
        value = getattr(self,x)
        if not callable(value):
            d[x] = value
    
    return d

有时,您可能只想获得 ONLY 类变量,而不是类变量 AND 实例变量。 您可以依靠__dict__筛选出实例变量。或者,您可以使用__class__获取属性并筛选出方法。 __class__不返回实例变量。

#after collecting your attributes using the above example...
for attr, value in vars(obj).items():
    d.pop(attr) #remove instance variables from the dict

#both vars(obj).items() and obj.__dict__.items() return similar iterable.

请注意,如果对象实现覆盖__dict__并返回None,则vars(obj)obj.__dict__.items()将不会返回字典。