【问题标题】:Iterating Over Elements in Objects迭代对象中的元素
【发布时间】:2015-02-02 20:21:25
【问题描述】:

Python iterating through object attributes

我在尝试理解 Objects 的迭代时发现了这个问题,并找到了 Eric Leschinski 的回复:

class C:
    a = 5
    b = [1,2,3]
    def foobar():
        b = "hi"   

c = C

for attr, value in c.__dict__.iteritems():
    print "Attribute: " + str(attr or "")
    print "Value: " + str(value or "")

生成的文本列出了 C 类中的所有属性,包括函数和隐藏属性(下划线包围),如下所示:

python test.py
Attribute: a
Value: 5
Attribute: foobar
Value: <function foobar at 0x7fe74f8bfc08>
Attribute: __module__
Value: __main__
Attribute: b
Value: [1, 2, 3]
Attribute: __doc__
Value:

现在,我了解了如何从迭代中过滤掉“隐藏”属性,但是有没有办法过滤掉所有函数呢?实际上,我正在寻找,在C 类中,只有属性ab,按顺序列出,没有__module____doc__ 信息,也没有恰好在@987654332 中的任何和所有功能@。

【问题讨论】:

标签: python iteration


【解决方案1】:

您必须过滤类型; function 对象和其他对象一样是属性。你可以在这里使用inspect.isfunction() predicate function

import inspect

for name, value in vars(C).iteritems():
   if inspect.isfunction(value):
       continue
   if name[:2] + name[-2:] == '____':
       continue

您可以将inspect.getmembers() function 与自定义谓词一起使用:

isnotfunction = lambda o: not inspect.isfunction(o)
for name, value in inspect.getmembers(C, isnotfunction):
   if name[:2] + name[-2:] == '____':
       continue

【讨论】:

  • 感谢您的回复!我不熟悉自定义谓词,但自定义谓词不能也用于过滤隐藏属性吗?类似于isnotfunctionorhidden = lambda o: not inspect.isfunction(o) and o.name[:2] + o.name[-2:] != '____'
  • @Humus:名称没有传递给谓词函数,只有值。
  • 好的,那么传递给 lambda 函数的 o 不是指向被检查元素的指针吗?
  • @Humus:是的,但这并没有给你类的属性名称。 __doc__ 属性的值是 ''(空字符串),所以 '' 被传递给谓词。你不能从那里去'__doc__'
  • 好的,再次感谢。我不明白是值而不是属性被传递到谓词中。
猜你喜欢
  • 2018-08-19
  • 2015-01-19
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2011-03-24
  • 2018-02-02
相关资源
最近更新 更多