我想在Python 2.7中定义一个简单的类和实例,但我在使用__getattr__时遇到了问题。以下是最小可行示例:
同样地,如果我输入
class MyClass:
def __init__(self,value):
self.a = value
def __getattr__(self,name):
return 'hello'
class MyOtherClass:
def __init__(self,value):
self.a = value
MyInstance = MyClass(6)
MyOtherInstance = MyOtherClass(6)
现在,如果我输入dir(MyInstance)
,我会得到:
TypeError: 'str' object is not callable
但是如果我输入dir(MyOtherInstance)
,我会得到:
['__doc__', '__init__', '__module__', 'a']
同样地,如果我输入
MyInstance
,我会得到以下结果:TypeError: 'str' object is not callable
但是如果我输入MyOtherInstance
,我会得到以下结果:
<__main__.MyOtherClass instance at 0x0000000003458648>
MyOtherInstance
的行为是我期望的。为什么我在 MyInstance
中没有得到这种行为呢?
__getattr__
的交互不良以及MyClass
是旧式类的事实有关。 - chepnerclass MyClass(object):
替换原来的类定义,问题就会消失。故事的寓意是:不要使用旧式类。 - chepnerobject
更容易的方法是在您编写的每个源文件的顶部放置__metaclass__ = type
(在任何__future__
导入之后,但在顶级,在任何类定义之前)。这在Python 3上不起作用(完全被忽略),但会使该模块中定义的所有类在Python 2上隐式地成为新样式。 - ShadowRanger