子类继承父类传参01

python中子类继承父类(传参数与不传参数)

Class A(object):
    def __init__(self,a='A'):
        print('Enter: ',a)
        print('Leave: ',a)
Class B:
    def __init__(self,a=None):
         print('ENter B')
        super(B,self).__init__(a)
print '111'
b=B()
print '222'
b=B(123)

输出:
111
Enter B
('ENter: ', None)
('Leave: ', None)
Leave B
222
Enter B
('ENter: ', 123)
('Leave: ', 123)
Leave B


    
               

发现不传参数时,输出是None,并没有使用父类A中的a='A',原因是B向A中传参None

需要注意的是,在python2.7中用super()继承父类时,父类需要时A(object) 格式,因为super是新式类的用法(新式类广度优先,经典类深度优先)

解决方案:

Class A(object):
    def __init__(self,a='A'):
        print('Enter: ',a)
        print('Leave: ',a)
Class B(A):
    def __init__(self,a=None):
        print('Enter B')
        if a = None:
            super(B,self).__init__()
        else:
            super(B,self).__init__(a)
        print('Leave B')
print '111'
b=B()
print '222'
b=B(123)

输出:
111
Enter B
('ENter: ', 'A')
('Leave: ', 'A')
Leave B
222
Enter B
('ENter: ', 123)
('Leave: ', 123)
Leave B

(逻辑同上,写法简单):

Class A(object):
    def __init__(self,a='A'):
        print('Enter: ',a)
        print('Enter: ',a)
Class B(A):
    def __init__(self,a=None):
    print('Enter B')
    exec('super(B,self).__init__'+(a!=None and '(a)' or '()'))
#实际执行过程 
#   exec('super(B,self).__init__'.__add__(a!=None and '(a)' or '()'))
    print('Leave B')
print '111'
b=B()
print '222'
b=B(123)

输出:
111
Enter B
('ENter: ', 'A')
('Leave: ', 'A')
Leave B
222
Enter B
('ENter: ', 123)
('Leave: ', 123)
Leave B

 

解决方案二:

Class A(object):
    def __init__(self,a='A'):
        print('Enter: ',a)
        print('Leave: ',a)
Class B(A):
    def __init__(self,*args,**kwargs):
        print('Enter B')
        super(B,self).__init__(*args,**kwargs)
        print('Leave B')
print '111'
b=B()
print '222'
b=B(123)
print '333'
b=B(a=123)

输出:
111
Enter B
('ENter: ', 'A')
('Leave: ', 'A')
Leave B
222
Enter B
('ENter: ', 123)
('Leave: ', 123)
Leave B
333
Enter B
('Enter: ',123)
('Leave: ',123)
Leave B

 

简便写法

Class A(object):
    def __init__(self,a='A'):
        print('Enter: ',a)
        print('Leave: ',a)
Class B(A):
    def __init__(self,*args,):
        print('Enter B')
        super(B,self).__init__(*args)
        print('Leave B')
print '111'
b=B()
print '222'
b=B(123)

输出:
111
Enter B
('ENter: ', 'A')
('Leave: ', 'A')
Leave B
222
Enter B
('ENter: ', 123)
('Leave: ', 123)
Leave B

缺陷是不能传参字典式(双指针),  b=B(a=123)不可行。

  

转载于:https://www.cnblogs.com/xzhdream/p/5450322.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值