Python 中的实例方法

Instance methods in Python

在C++中,一个特定class的所有对象都有自己的数据成员,但共享成员函数,在内存中只存在一个副本。 Python 的情况是否相同,或者 class 的每个实例都存在不同的方法副本?

是 - 内存中只存在该方法的一个副本:

Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
...     def test():
...         return 1
...
>>> a = A()
>>> b = A()
>>> id(a.test)
140213081597896
>>> id(b.test)
140213081597896

是的,对于 class 方法和实例方法,函数位于所有实例的相同内存槽

但是您将无法覆盖该方法并影响其他实例,通过覆盖您只需向实例 dict 属性添加新条目(参见 有关查找的更多上下文)。

>>> class A():
...   def x():pass
... 
>>> s = A()
>>> d = A()
>>> id(s.x)
4501360304
>>> id(d.x)
4501360304

让我们一起来寻找答案,通过简单的测试:

class C:
    def method(self):
        print('I am method')

c1 = C()
c2 = C()

print(id(c1.method))  # id returns the address 
>>> 140161083662600

print(id(c2.method))
>>> 140161083662600

这里id(obj):

Return the identity of an object.

This is guaranteed to be unique among simultaneously existing objects. (CPython uses the object's memory address.)