python 继承中的self和__init__

有如下继承关系:

#python 2.7
class GrandFather:
        def __init__(self):
                print('grandfather')
                print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
                self.define_model()

        def define_model(self):
                pass        

class Father(GrandFather):
        def __init__(self):
                print('father')
                print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
                self.define_model()

        def define_model(self):
                print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))

class Son(Father):
        def __init__(self):
                print('son')
                print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))

        def define_model(self):
                print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
    
s = Son()
print('s \'s addr: {}'.format(s))
输出:

son
---Son's __init__ with addr: <__main__.Son instance at 0x7fcba6f55e60>
s 's addr: <__main__.Son instance at 0x7fcba6f55e60>
这是显而易见的,因为s作为Son的实例,在Son存在__init__的情况下,Son的__init__肯定会被调用了。

再看下面这个:

#略
class Son(Father):
	#def __init__(self):
	#	print('son')
	#	print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))

	def define_model(self):
		print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))

#略
将最上面程序中的Son类的__init__去掉,那么输出是什么呢?

输出:

father
---Son's __init__ with addr: <__main__.Son instance at 0x7f45b9dc4d88>
This is Son's define_model
s 's addr: <__main__.Son instance at 0x7f45b9dc4d88>
由于Son没有__init__,Father的__init__被调用了,不过,其中的self是指向Son的实例s的

再看一个:

class Father(GrandFather):
	#def __init__(self):
	#	print('father')
	#	print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))
	#	self.define_model()

	def define_model(self):
		print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))

class Son(Father):
	#def __init__(self):
	#	print('son')
	#	print('---{}\'s __init__ with addr: {}'.format(self.__class__.__name__, self))

	def define_model(self):
		print('This is {}\'s {}'.format(self.__class__.__name__, self.define_model.__name__))
同时把Son和Father的__init__去掉,会输出什么呢?

输出:

grandfather
---Son's __init__ with addr: <__main__.Son instance at 0x7f206982dcb0>
This is Son's define_model
s 's addr: <__main__.Son instance at 0x7f206982dcb0>
GrandFather的__init__被调用了,不过依然,self是指向s的

由此,得出了一个结论(对语言而言,得出结论这种说法仅仅作为记忆用,并不是绝对的,因为语言是人创造的,不是自然存在的):

在继承关系中,缺少__init__的类会调用其血缘关系最近的类的__init__,以此类推。Son没有,就调Father的;Father没有,就调GrandFather的,若GrandFather没有,就什么都没有了(这种情况在本文中就没写了,不过做过实验,可以确认)。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值