a继承b后 重写a类中的继承的来自b的方法 为什么地址没有变?

frankyang1 Python语言基本语法 最后由 andelf 于2015年01月25日回复

  • 1 回答
  • 1.2k 浏览

class first():

    nu="sss"

    def __init__(self):

        self.nui="ssss"

    def se(self,a):

        self.io=a

class two(first):

    ni="tws"

    def se(self,a="s"):

        self.two="s"

        first.se(self, a)

fi=two()

print id(first.se),id(two.se),id(fi.se)

为什么值是相同的?

但是变量改变地址就会改变?


是不是所有的对象和派生的对象都是用的同一个内存地址的方法

  • andelf 2015年01月25日 回答 #1楼
  • 你这个问题已经牵扯到Python的实现细节了。

    first.se two.se 均返回 unbound method 对象

    fi.se 返回 bounded method 对象(这些你可以直接print出来)

    print 调用 id 引用 first.se 这个名字后,创建新 unbound method 对象, id() 调用完毕后,这个对象没有多余引用(垃圾回收机制中到引用计数为0),所以被释放,对应的 Pyobject (底层实现)被释放,回到内存池。(Python用内存池管理对象创建回收,避免多次调用malloc/free)

    引用 two.se 时,直接从内存池里取到了刚才的Pyobject,所以id返回数字相同。

    bounded method 和 unbound method 使用相同内存池。(这里细节可能需要查看C实现,个人认为是 instancemethod 函数等等共享内存池。)

    代码修改为

    a = first.se
    print id(a),id(two.se),id(fi.se)
    

    你就能看到区别了。

  • 0 评论