python里的self

我对python self的总结是:

1.对于成员变量:

子类在初始化过程中,如果进入到父类的初始化函数中,在父类中遇到的self.variable(父类中)都将变成子类的成员变量,即便是在子类中没有定义这个变量,初始化完成后也可以在子类的成员中调用那个变量。废话少说,直接上代码:

from classctob import *

class Extentd(Extentc):
    def __init__(self):
        super(Extentd, self).__init__()
        self.__class__.myglobal='global from d'
        ##self.name='I am d'
   
    def onStart(self):
        print self.name
        print self.__class__.myglobal
        print self.test

 
       
if __name__=='__main__':
    d=Extentd()
    d.start()

---------------------------------------------------------------------------------------------------------

from classbtoa import *

class Extentc(Extentb):
    def __init__(self):
        super(Extentc,self).__init__()
        self.__class__.myglobal='global from c'
        self.name='I am c'
        self.test="I'm defined in c!"
   
    def onStart(self):
        print self.name
        print self.__class__.myglobal
   
    def start(self):
        super(Extentc,self).start()
       
if __name__=='main':
    pass

------------------------------------------------------------------------------------

class Basea(object):
    '''
    basea is base class
    '''
    myglobal=None
    def __init__(self):
        self.name='I am basea'
        self.__class__.myglobal='global from basea'
        print self.__class__.myglobal
       
    def onStart(self):
        print self.name
        print self.__global
       
       
class Extentb(Basea):
    def __init__(self):
        super(Extentb,self).__init__()
        print self.name
        print self.__class__.myglobal
        self.__class__.__global='global from b'
        self.name='I am b'
   
    def onStart(self):
        print self.name
        print self.__global
       
    def start(self):
        self.onStart()
       
if __name__=='main':
    pass

-------------------------------------------------------------------------------

以上代码的继承关系是:basea是基类,Extentb(basea),Extentc(Extentb),Extentd(Extentc)

其中Extentc里定义了变量self.test,这个变量并没有在Extentd中,但是Extentd却用print输出了这个变量的值。

 

 

2.对于成员函数:

用self.func代表调用一个成员函数。在《dive into python》中有对self的这样的描述:“在 __init__ 方法中,self 指向新创建的对象;在其它的类方法中,它指向方法被调用的类实例”

在以上代码中d.start()将调用Extentc.start()(因为Extentd中没有定义start(),只能去父类中找了),这个函数又指向了父类的start(),而在父类中是self.onStart(),此时将会调用Extentb.onStart()吗?不是!是调用Extentd.onStart()。也就是说绕了一大圈最终还是调的底层子类的onStart()函数。这对于C++程序员会感到有些不适应。这也是python的self不能完全当做C++里的this的原因。

 

从以上两点可以看出python里的self有多“自私”了吧,它把每一个遇到的变量都据为己有(如果自己没有的话),每遇到的一个函数调用都先从自身的函数里找,没有再去调父类的(这倒有些像重载父类函数了)

***************************************************************************

欢迎扫码关注我的微信公众号zhixin991

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值