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()
模拟 绑定,但这不是一回事。
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 函数,添加到 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()
模拟 绑定,但这不是一回事。