3

我有以下代码:

#!/usr/bin/env python
#!/usr/bin/env pypy

class my_components(object):
    COMP0 = 0
    COMP1 = 1
    COMP1 = 2
    __IGNORECOMP = -1

def attribute_dictionary(o):
    d = { }
    for attr in dir(o):
        if attr[:2] != '__':
            print o,attr
            d[attr] = o.__getattribute__(o, attr)
    return d

def main():
    print attribute_dictionary(my_components)

if __name__ == '__main__':
    main()

我用来在python中有效地做花哨的枚举。

它在 python 中效果很好,打印:

<class '__main__.my_components'> COMP0
<class '__main__.my_components'> COMP1
<class '__main__.my_components'> _my_components__IGNORECOMP
{'COMP0': 0, 'COMP1': 2, '_my_components__IGNORECOMP': -1}

但是,当我使用 pypy(切换前两行)运行它时,它会失败并显示:

<class '__main__.my_components'> COMP0
Traceback (most recent call last):
  File "app_main.py", line 53, in run_toplevel
  File "./pypy_Test.py", line 25, in <module>
    main()
  File "./pypy_Test.py", line 21, in main
    print attribute_dictionary(my_components)
  File "./pypy_Test.py", line 17, in attribute_dictionary
    d[attr] = o.__getattribute__(o, attr)
TypeError: unbound method __getattribute__() must be called with my_components instance as first argument (got type instance instead)

任何见解都将受到欢迎。

-谢谢

4

2 回答 2

4

您正在调用__getattribute__传递,而不是该类的实例。从__getattribute__文档中:

无条件调用以实现类实例的属性访问。

将类作为 cPython 中的第一个参数,这完全可以工作,这是一个令人高兴的巧合。正式地,第一个参数应该是一个实例。

于 2012-12-14T21:37:13.767 回答
2

TypeError:__getattribute__()必须以 my_components 实例作为第一个参数调用未绑定的方法(改为获取类型实例)

这就是说(至少对于 PyPy),第一个参数__getattribute__必须是 class 的实例my_components

相反,o是类my_components本身,而不是实例。

尝试改变

d[attr] = o.__getattribute__(o, attr)

d[attr] = getattr(o, attr)
于 2012-12-14T21:37:00.833 回答