我有以下代码:
#!/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)
任何见解都是最受欢迎的。
-Thanks
答案 0 :(得分:4)
您正在调用__getattribute__
传递类,而不是该类的实例。来自__getattribute__
documentation:
无条件调用以实现类的实例的属性访问。
这一点在cPython中作为第一个参数的类完全可行是一个快乐的巧合;正式来说,第一个参数应该是一个实例。
答案 1 :(得分:2)
TypeError:必须使用调用未绑定方法
__getattribute__()
my_components实例作为第一个参数(取而代之的是类型实例)
这就是说(至少对于PyPy),__getattribute__
的第一个参数必须是类my_components
的一个实例。
相反,o
本身就是类my_components
,而不是实例。
尝试更改
d[attr] = o.__getattribute__(o, attr)
到
d[attr] = getattr(o, attr)