获取类的属性

新手上路,请多包涵

我想获取一个类的属性,比如:

 class MyClass():
  a = "12"
  b = "34"

  def myfunc(self):
    return self.a

使用 MyClass.__dict__ 给我一个属性和函数的列表,甚至像 __module____doc__ 这样的函数。虽然 MyClass().__dict__ 给我一个空字典,除非我明确设置该实例的属性值。

我只想要属性,在上面的例子中是: ab

原文由 Mohamed Khamis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 549
2 个回答

尝试 检查 模块。 getmembers 各种测试应该会有所帮助。

编辑:

例如,

 class MyClass(object):
    a = '12'
    b = '34'
    def myfunc(self):
        return self.a

>>> import inspect
>>> inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
[('__class__', type),
 ('__dict__',
  <dictproxy {'__dict__': <attribute '__dict__' of 'MyClass' objects>,
   '__doc__': None,
   '__module__': '__main__',
   '__weakref__': <attribute '__weakref__' of 'MyClass' objects>,
   'a': '34',
   'b': '12',
   'myfunc': <function __main__.myfunc>}>),
 ('__doc__', None),
 ('__module__', '__main__'),
 ('__weakref__', <attribute '__weakref__' of 'MyClass' objects>),
 ('a', '34'),
 ('b', '12')]

现在,特殊的方法和属性让我很紧张——它们可以通过多种方式处理,其中最简单的方法就是根据名称进行过滤。

 >>> attributes = inspect.getmembers(MyClass, lambda a:not(inspect.isroutine(a)))
>>> [a for a in attributes if not(a[0].startswith('__') and a[0].endswith('__'))]
[('a', '34'), ('b', '12')]

……其中更复杂的可能包括特殊的属性名称检查甚至元类;)

原文由 Matt Luongo 发布,翻译遵循 CC BY-SA 3.0 许可协议

def props(cls):
  return [i for i in cls.__dict__.keys() if i[:1] != '_']

properties = props(MyClass)

原文由 Doug 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题