哈萨特尔关于类名



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

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

像这样:

class A:
    def Attr1(self):
        pass
> hasattr(A, 'Attr1')
True
> 

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

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

对此

是否有任何官方的蟒蛇立场?我假设文档中提到的对象正在谈论一个实例对象。

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

除了实例之外,它还适用于class这一事实是有意为之的。 事实上,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 的实例。

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

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

instance_of_SomeClass.some_method(parameters, ...)

实际上是句法糖

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

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

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

我建议你阅读这一章(如果你有时间的话,或者整本书):

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

最新更新