>> type(B.__dic-6ren">
gpt4 book ai didi

python - 实例方法还是函数?

转载 作者:IT老高 更新时间:2023-10-28 20:46:39 26 4
gpt4 key购买 nike

今天我定义了一个类来测试接下来会发生什么:

class B(object):
def p(self):
print("p")

后来我这样做了:

>>> type(B.__dict__['p'])
<type 'function'>
>>> type(B.p)
<type 'instancemethod'>

那么,为什么? B.pB.__dict__['p'] 不是同一个对象吗?

当我尝试这个时,我的惊讶增加了:

>>> B.__dict__['p']
<function p at 0x3d2bc80>
>>> type(B.__dict__['p'])
<type 'function'>

好的,到目前为止一切顺利,类型在两个结果function中,但是当我尝试时:

>>> B.p
<unbound method B.p>
>>> type(B.p)
<type 'instancemethod'>

什么?!,为什么? 未绑定(bind)方法instancemethod?那些是一样的吗?为什么有两个不同的名字?

嗯,看来python充满了惊喜!

这是我正在使用的python:

Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.

最佳答案

这是一个非常好的问题。

清除一些东西:

  1. 当通过其类(例如 B.p)访问方法名称时,它被称为 unbound
  2. 否则,如果通过其类的实例(例如 B().p)访问该方法,则称该方法是 bound

boundunbound 的主要区别在于,如果 bound,第一个参数将隐含地是 调用的实例 类。这就是为什么我们必须在定义每个方法时添加 self 作为第一个参数。当unbound时,你必须明确地传递你想要应用方法逻辑的类的实例。

例如:

class B(object):
def foo(self):
print 'ok'

>>>B().foo()
ok
>>>B.foo()
Exception, missing an argument.
>>>B.foo(B())
ok

这是boundunbound的基本解释。现在关于 __dict__ 的怪异之处。 Python 中的任何对象都可以定义 __get____set__ 方法,当它们是类中的属性时,它们控制对它们的访问。这些被称为描述符

简单来说,当你通过实例或类访问一个类的属性(属性)时,Python 不会直接返回对象,而是调用 __get____set__ 方法返回一个方便使用的对象。

Python 中的函数会覆盖此 __get__ 方法。因此,当您发出 B.fooB().foo 时,它会返回一个 instancemethod 类型,它是 function< 的包装器 类型(将 self 作为第一个参数隐式传递的包装器)。当您通过原始类的字典访问该函数时,不会调用 __get__ 因为您没有将它们作为类的属性进行访问,因此返回值为 raw 函数。

关于这个话题有很多话要说,我试图对这样一个聪明的话题给出一个非常简单的答案。您可以在 Guido 的博客文章 The Inside Story on New-Style Classes 上找到权威信息,非常推荐。

更新:关于您的最后一个示例:

>>> B.p
<unbound method B.p>
>>> type(B.p)
<type 'instancemethod'>

请注意,在 Python 的解释器中,>>>B.p 实际上并不打印对象的类型,而是打印对象的 __repr__ 方法。您可以通过执行 >>>print B.p.__repr__() 来检查它并看到它的相同结果:)

Python 充满了间接和委托(delegate),这就是它如此灵活的原因。

希望这能澄清一点。

关于python - 实例方法还是函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20683985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com