4

hasattr文档说它接受一个对象和一个属性名称,并让您知道该属性是否存在于该对象上。

我发现它似乎也适用于类名(即不是实例对象)。

就像是:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 

我想用它来使一些测试代码更容易编写,但不想稍后被咬,以防这是实现的副作用而不是真正的意图。

请不要要求查看测试代码以查看我是否可以做其他事情,因为这不是真正的问题。

对此有任何官方的python立场吗?我认为在文档中提到的对象是在谈论实例对象。

我尝试使用谷歌搜索(并查看 StackOverflow 中的一些问题),但似乎没有找到任何东西。

4

3 回答 3

7

class除了实例之外,它还适用于 a 的事实是有意的。实际上,hasattr应该对您传递给它的任何对象起作用。基本上,它做了这样的事情:

def hasattr(obj, attribute):
    try:
        getattr(obj, attribute)
    except:
        return False
    return True

您可以依靠它,而不必担心以后会被更改所困扰。请注意,python-dev 上有一些关于hasattr被设计破坏的讨论。它的要点是hasattr捕获任何可能具有误导性的异常。


请注意,在 python 中,类本身就是type.

>>> class Foo(object):
...   pass
... 
>>> type(Foo)
<type 'type'>

所以一切都是某事的一个实例1

1type是它自身的一个实例,这在纯 python 中是不可能做到的......

于 2015-04-27T16:10:40.027 回答
3

我手头没有关于“官方 Python 立场”的参考资料,但这是完全正常和有意的。请记住

instance_of_SomeClass.some_method(parameters, ...)

实际上是语法糖

SomeClass.some_method(instance_of_SomeClass, parameters, ...)

即这些方法实际上是类的属性,因此可以用hasattr.

于 2015-04-27T16:13:58.663 回答
1

只是想要一个参考(即使对于一切都是对象的句子......)

我建议您阅读本章(如果有时间,可以阅读整本书):

http://www.diveintopython.net/getting_to_know_python/everything_is_an_object.html

于 2015-04-27T16:17:11.650 回答