码迷,mamicode.com
首页 > 其他好文 > 详细

子类继承父类传参01

时间:2016-05-01 13:31:29      阅读:171      评论:0      收藏: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)不可行。

  

子类继承父类传参01

标签:

原文地址:http://www.cnblogs.com/xzhdream/p/5450322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!