我对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