2

这个问题只是出于好奇。

在阅读python 的对象模型文档时,我决定对类方法的 id 进行一些试验,并发现了这种行为:

 Python 3.2.2 (default, Sep  4 2011, 09:07:29) [MSC v.1500 64 bit (AMD64)] on win32
 Type "copyright", "credits" or "license()" for more information.
 >>> class A():
    def a(self):
        pass


 >>> id(A().a)
 54107080
 >>> id(A().a)
 54108104
 >>> id(A().a)
 54107080
 >>> id(A().a)
 54108104
 >>> 
 >>> id(A().a)
 54108104
 >>> 
 >>> id(A().a)
 54108104
 >>> id(A().a)
 54107080
 >>> 

方法的id随着行的奇偶性而变化!

我其实是想创建同一个类的几个实例,看看它们是否有相同的方法对象,我希望它们是完全相同的,或者每次都改变,我没想到的是方法id将与解释器线是否均匀有关!有任何想法吗?

注意:我知道文档和解释器的版本不匹配,只是碰巧我在 Windows 上,我只安装了 3.2

4

1 回答 1

2

我将解释这条线的id(A().a)作用:

A() # creates a new object I call a

然后

A().a # creates a function f bound to a
A.a.__get__(A(), A) # same as above

>>> A.a.__get__(A(), A)
<bound method A.a of <__main__.A object at 0x02D85550>>
>>> A().a
<bound method A.a of <__main__.A object at 0x02D29410>>

这个绑定函数总是另一个,因为它有另一个对象__self__

>>> a = A()
>>> assert a.a.__self__ is a

__self__将作为第一个参数传递self给函数 Aa

编辑:这就是它的样子:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:55:48) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class A:
    def a(self):
        pass


>>> id(A().a)
43476312
>>> id(A().a)
49018760

这里的 id 像 abab 一样重复

Python 3.2.2 (default, Sep  4 2011, 09:51:08) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> class A:
    def a(self):
        pas
        s


>>> id(A().a)
50195512
>>> id(A().a)
50195832
>>> id(A().a)
50195512
>>> id(A().a)
50195832

编辑:对于 linux 或者什么不是我的机器以及我不知道的任何东西

id(A().a)

将始终给出相同的结果,除非您将其存储到变量中。我不知道为什么,但我认为这是因为性能优化。对于堆栈上的对象,您不需要每次调用函数时都为对象分配新空间。

于 2013-03-10T11:49:52.320 回答