标签:
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)不可行。
标签:
原文地址:http://www.cnblogs.com/xzhdream/p/5450322.html