【问题标题】:hasattr on class nameshasattr 对类名
【发布时间】:2015-07-06 04:47:34
【问题描述】:

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

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

类似:

class A:
    def Attr1(self):
        pass

> hasattr(A, 'Attr1')
True
> 

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

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

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

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

【问题讨论】:

  • “我认为在文档中提到的对象是一个实例对象” - 不,任何对象,包括类本身。
  • 这很正常。请记住,instance.method(stuff ...) 实际上是 Class.method(instance, stuff ...) 的语法糖,即这些方法实际上是类的属性。
  • @jonrsharpe:太好了!有没有任何参考。对我来说似乎有点奇怪:-)
  • 实例对象;它们是type 的实例(或任何该类的元类)。
  • @ProgrammerPerson 哦,来吧; "python 一切都是对象" 的第一个谷歌命中:stackoverflow.com/q/865911/3001761

标签: python hasattr


【解决方案1】:

除了实例之外,它还可以在class 上工作,这是有意的。事实上,hasattr 应该适用于您传递给它的 any 对象。基本上,它会做这样的事情:

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

您可以依靠它,而不必担心以后会被更改所困扰。请注意,python-dev 上有一些关于hasattr being broken by design 的讨论。它的要点是hasattr 捕获any 异常,这可能会产生误导。


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

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

所以一切都是something1的实例。

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

【讨论】:

  • 有趣。我没有意识到hasattr() 是这样坏的。
  • @Kevin -- 是的。我什至看到有人提到它会捕捉到像StopIterationSystemExit 这样的疯狂东西——但我不确定这是不是真的。无论如何,我见过很多人编写自己的版本...return getattr(obj, attr, sentinel) is not sentinel
  • 我刚刚查看了这个,它是apparently fixed in 3.2... 没有关于 2.7 用户是否不走运的消息。
  • 你的第二段回答了我。
【解决方案2】:

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

instance_of_SomeClass.some_method(parameters, ...)

实际上是语法糖

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

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

【讨论】:

  • 感谢您的回答。 +1。
  • 很好的解释。给出了为什么方法是类的属性的答案。也就是类属性。
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的链接。我得到了 +15 代表,所以为你 +1 :)
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 2014-09-18
  • 2013-04-09
  • 1970-01-01
  • 2015-07-24
  • 2011-11-04
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多