hasattr on class names

Pro*_*son 4 python hasattr

hasattr文档说它需要一个对象和一个属性名称,并让你知道该对象上是否存在该属性.

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

就像是:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

mgi*_*son 6

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

def hasattr(obj, attribute):
    try:
        getattr(obj, attribute)
    except:
        return False
    return True
Run Code Online (Sandbox Code Playgroud)

你可以依靠它,而不是害怕稍后改变.注意,有一些关于hasattr被设计破坏的 python-dev的讨论.它的要点是hasattr抓住任何可能误导的例外.


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

>>> class Foo(object):
...   pass
... 
>>> type(Foo)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)

所以一切的一个实例的东西1.

1type是一个自己的实例,这是纯python中无法做到的事情......