代码改变世界

子类继承父类传参01

2016-05-01 12:35  xzh—dream  阅读(599)  评论(0编辑  收藏  举报

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)不可行。