擅长:python、mysql、java
<p><code>getattr</code>是一个内置函数,至少有两个参数:从中获取属性的对象和属性的字符串名。</p>
<p>如果字符串名是常量,比如<code>'foo'</code>,<code>getattr(obj, 'foo')</code>与<code>obj.foo</code>完全相同。</p>
<p>因此,内置函数<code>getattr</code>的主要用例是,当属性名不是常量,而是变量时。第二个重要的用例是当您传递三个参数,而不是两个:在这种情况下,如果属性不在对象中,<code>getattr</code>返回第三个“default”参数,而不是引发异常。</p>
<p><code>__getattr__</code>是在类中定义的一种特殊方法,当请求该类实例的某个属性时调用该方法,而其他提供该属性的常规方法(通过实例的<code>__dict__</code>、插槽、属性等)全部失败。例如,当您希望将未定义的属性查找委托给其他对象时,可以定义它。</p>
<p>因此,您的第二个示例是错误的,因为内置的<code>getattr</code>不能用单个参数调用。</p>
<p>第三个失败是因为试图从中“获取属性”的字典没有该属性——它有<strong>项,当然这些项与属性完全不相交。</p>