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.)
在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.)