hasattr() 是一种方法吗?

Is hasattr() a method?

hasattr()是一种方法吗?它确实以一个对象实例作为参数,但它并没有像object.hasttr()那样使用。我会说这不是一种方法吗?

Python中的一切都是对象,甚至是函数和方法。所以 hasattr() 需要一个对象这一事实并没有什么特别的, str()input() 以及 sum().

也是如此

方法是一种函数,它通过作为属性访问对象而绑定到对象;所以 "foo bar".split 给你绑定的 str.split 方法:

>>> "foo bar".split
<built-in method split of str object at 0x7f84bef6a730>

这个恰好是“built-in”,因为它是作为 Python 运行时的一部分实现的,但它与 class 中编写的函数没有什么不同 Python.

调用它 returns 方法的结果 应用于它绑定到的字符串:

>>> method = "foo bar".split
>>> method()
['foo', 'bar']

我也可以直接用,unbound:

>>> str.split("spam ham")
['spam', 'ham']

hasattr() 未绑定。这是一个功能。即使您尝试了 *.

,也不能像使用 Python 函数那样绑定它

Python 函数,添加到 class,当您将它们作为 class:

实例的属性访问时,它们会自动成为方法
>>> class KnightsWhoSayNi:
...     pass
...
>>> def speak(self): return "Ni!"
...
>>> speak
<function speak at 0x10fe65f28>
>>> knight = KnightsWhoSayNi()
>>> hasattr(knight, "speak")  # using that function you mentioned!
False
>>> KnightsWhoSayNi.speak = speak  # adding the function to the class
>>> knight.speak   # now it exists! As a method...
<bound method speak of <__main__.KnightsWhoSayNi object at 0x10fe71080>>
>>> knight.speak()
'Ni!'

请注意 speak() 是如何被赋予一个名为 self 的参数的,但我不必将其传入。因为该方法是 绑定 到class 的特定实例,这是自动处理的。传入的第一个参数是实例。名称甚至无关紧要,但 self 是惯例,最好坚持这一点。

作为练习,您可以自己尝试上面的示例。然后尝试将 hasattr 添加到 class。你会发现你可以t use it like a method, it won't become bound via knight.hasattr`,实例不会作为第一个参数传入,你仍然必须传入两个参数才能让它工作。

如果您想深入了解,可以在 Python Descriptors HOW-TO 中了解绑定的工作原理。如果这感觉太大了,请不要担心,这已经很先进了。


* 至 pre-empt not-picking:您可以使用 functools.partial() or functools.partialmethod() 模拟 绑定,但这不是一回事。