繁体   English   中英

Python中的实例方法

[英]Instance methods in Python

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

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

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

对于类方法和实例方法,这些函数位于所有实例的同一内存插槽中。

但是,您将无法覆盖该方法并影响其他实例,通过覆盖您只需向实例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):

返回对象的标识。

这保证在同时存在的对象中是唯一的。 (CPython使用对象的内存地址。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM