hasattr on class names

时间:2015-04-27 16:05:33

标签: python hasattr

hasattr文档说它需要一个对象和一个属性名称,并告诉您该对象是否存在该属性。

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

类似的东西:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 

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

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

这有什么官方的python立场吗?我假设在文档中提到的对象是在讨论实例对象。

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

3 个答案:

答案 0 :(得分:6)

除了实例之外,它在class上工作的事实是故意的。实际上,hasattr应该在传递给它的任何对象上工作。基本上,它做了这样的事情:

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

你可以依靠它,而不是害怕稍后改变。注意,关于hasattr being broken by design的python-dev有一些讨论。它的要点是hasattr捕获任何异常,这可能会产生误导。

请注意,在python类中,它们本身就是type的实例。

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

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

1 type是一个自己的实例,这在纯python中是不可能的......

答案 1 :(得分:2)

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

instance_of_SomeClass.some_method(parameters, ...)

实际上是

的语法糖
SomeClass.some_method(instance_of_SomeClass, parameters, ...)

即。这些方法实际上是类的属性,因此可以使用hasattr进行测试。

答案 2 :(得分:1)

  

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

我建议你阅读本章(如果你有时间的话,请阅读全书):

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