擅长:python、mysql、java
<p>发生此错误是因为对<em>所有</em>属性调用了<code>__getattribute__</code>,并且您已经将其定义为返回<code>None</code>,而不是“hello”。由于<code>__getattribute__</code>本身是一个属性,当您尝试调用它时,您将得到一个<code>TypeError</code>。在</p>
<p>可以通过调用未处理属性的基类方法来解决此问题:</p>
<pre><code>>>> class Ip500Device(object):
... def __getattribute__(self, att):
... print('getattribute: %r' % att)
... if att == 'hello':
... return 0
... return super(Ip500Device, self).__getattribute__(att)
...
>>> abcd = Ip500Device()
>>> abcd.__getattribute__('hello')
getattribute: '__getattribute__'
getattribute: 'hello'
0
</code></pre>
<p>但是,最好定义<code>__getattr__</code>,因为它只对不存在的属性调用:</p>
^{pr2}$
<p>最后,请注意,如果您只想通过名称访问属性,则可以使用内置的<a href="http://docs.python.org/2/library/functions.html#getattr" rel="nofollow noreferrer">getattr</a>函数:</p>
<pre><code>>>> class Ip500Device(object): pass
...
>>> abcd = Ip500Device()
>>> abcd.foo = 10
>>> getattr(abcd, 'foo')
10
</code></pre>