0 前言
系统:win7 64bit
IDE : python(x,y) 2.7.6.1
IDE集成的解释器:Python 2.7.6 (default, Nov 10 2013, 19:24:18) [MSC v.1500 32 bit (Intel)] on win32
1 单继承
1.1 定义一个时间类,带默认参数
class mytime(object): def __init__(self,hour=21, minute=13, second=50): self.hour = hour self.minute = minute self.second = second def __str__(self): return '__str__ hour:minute:second = %02d:%02d:%02d' %(self.hour,self.minute,self.second) def get_hour(self): return self.hour def get_minute(self): return self.minute def get_second(self): return self.second def print_time(self): print 'hour:minute:second = %02d:%02d:%02d' %(self.hour,self.minute,self.second)
说明: 构造函数 __init__(self,hour=21, minute=13, second=50) 带默认参数的定义方式 ;
用于输出的函数 __str__
得到某属性值的方法 get_xxxx
输出属性值的方法 print_time
1.2 定义日期时间类,继承时间类的属性和方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
class mydatetime(mytime): def __init__( self ,year = 2016 ,mounth = 1 ,day = 1 , hour = 21 , minute = 13 ,second = 50 ): super (mydatetime, self ).__init__(hour,minute,second) self .year = year self .mounth = mounth self .day = day def __str__( self ): return '__str__ year--mounth--day = %02d--%02d--%02d'
% ( self .year, self .mounth, self .day) def __del__( self ): """ __del__ mydatetime destroyed """ print "__del__ mydatetime destroyed" def print_date( self ): print 'year-mounth-day = %04d-%02d-%02d'
% ( self .year, self .mounth, self .day) # self.print_time() |
说明: mydatetime 继承 mytime 的属性值,这里mydatetime(子类),mytime(父类)
构造函数 __init__(self,year = 2016,mounth = 1,day = 1, hour=21, minute=13,second=50) 带默认参数的定义方式 ,注意要通过 super初始化父类属性值;
用于输出的函数 __str__
输出属性值的方法 print_date
1.3 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
if __name__ = = '__main__' : print "
" print "--" * 10 , " mytime t0:" t0 = mytime() print t0 t0.print_time() print t0.get_hour() print "
" print "--" * 10 , " mytime t1:" t1 = mytime(hour = 7 ,second = 20 ) t1.print_time() print "
" print "--" * 10 , " mydatetime da:" da = mydatetime(minute = 40 ) print da # da.print_date() da.print_time() del da |
输出:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
>>> runfile( 'F:/Python/hysrc_py/untitled0_class.py' , wdir = r 'F:/Python/hysrc_py' ) - - - - - - - - - - - - - - - - - - - - mytime t0: __str__ hour:minute:second = 21 : 13 : 50 hour:minute:second = 21 : 13 : 50 21 - - - - - - - - - - - - - - - - - - - - mytime t1: hour:minute:second = 07 : 13 : 20 - - - - - - - - - - - - - - - - - - - - mydatetime da: __str__ year - - mounth - - day = 2016 - - 01 - - 01 hour:minute:second = 21 : 40 : 50 __del__ mydatetime destroyed >>> |
2 多重继承
2.1 定义父类 classA classX
1
2
3
4
5
6
7
8
9
10
11
12
|
class classA( object ): def __init__( self ): print ( 'init action in father class A' ) class classX( object ): def __init__( self ): print ( 'init action in father class X' ) |
2.2 SubClassB 继承 classA
1
2
3
4
5
6
7
|
class SubClassB(classA): def __init__( self ): print ( 'init action in subclass B' ) super (SubClassB, self ).__init__() |
2.3 SubClassC 继承 SubClassB
1
2
3
4
5
6
7
|
class SubClassC(SubClassB): def __init__( self ): print ( 'init action in subclass C' ) super (SubClassC, self ).__init__() |
2.4 测试
实例化一个SubClassC类
1
2
3
4
5
|
if __name__ = = '__main__' : print "
" print "--" * 10 , " SubClassC b:" b = SubClassC() |
由输出可知:多重继承时,子类会自动调用父类的构造函数
1
2
3
4
|
- - - - - - - - - - - - - - - - - - - - SubClassC b: init action in subclass C init action in subclass B init action in father class A |
3 多重继承
3.1 定义两个基本类 classA 和 classX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class classA( object ): def __init__( self ,a = 'classA' ): self .a = a print ( 'init action in father class A' ) def print_a( self ): print self .a class classX( object ): def __init__( self ,x = 'classX' ): self .x = x print ( 'init action in father class X' ) def print_x( self ): print self .x |
3.2 SubClassX 类继承自 classA 和 classX
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class SubClassX(classA,classX): def __init__( self ,a = 'SubClassX:a' ,x = 'SubClassX:x' ): print ( 'init action in subclass X' ) super (SubClassX, self ).__init__() # classX.__init__(self) self .a = a self .x = x def print_SubX( self ): self .print_a() self .print_x() |
3.3 实例化一个 SubClassX 类
1
2
3
4
5
6
|
if __name__ = = '__main__' : print "
" print "--" * 10 , " SubClassX x:" sx = SubClassX() sx.print_SubX() |
3.4 由输出可知 : SubClassX 继承了 classA 和 classX 的方法和属性,但不知为何只调用了 classA的初始化函数?
1
2
3
4
5
|
- - - - - - - - - - - - - - - - - - - - SubClassX x: init action in subclass X init action in father class A SubClassX:a SubClassX:x |
3.5 分析:其实在 3.4 的输出可知,SubClassX只调用了classA的初始化,则classX的属性是不会自动初始化的,如classX的属性值x,之所以能够输出 "SubClassX:x" ,是由于在 3.2的定义中,手动初试化了 属性值。self.a = a self.x = x
如下例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class SubClassX(classA,classX): def __init__( self ,a = 'SubClassX:a' ,x = 'SubClassX:x' ): print ( 'init action in subclass X' ) super (SubClassX, self ).__init__(a) # classX.__init__(self) # self.x = x def print_SubX( self ): self .print_a() self .print_x() |
实例化一个 SubClassX 类:
1
2
3
4
5
6
|
if __name__ = = '__main__' : print "
" print "--" * 10 , " SubClassX x:" sx = SubClassX() sx.print_SubX() |
输出报错: 由于定义SubClassX类时,使用 super 初始化父类,只会初试化 classA,即第一个类。而classX排在了classA之后,不会自动初始化。所以在实例化类调用方法时,即 sx.print_SubX() 。由于没有属性 'x' 而报错。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
- - - - - - - - - - - - - - - - - - - - SubClassX x: init action in subclass X init action in father class A SubClassX:a Traceback (most recent call last): File "<stdin>" , line 1 , in <module> File "C:Python27libsite-packagesspyderlibwidgetsexternalshellsitecustomize.py" , line 540 , in runfile execfile (filename, namespace) File "F:/Python/hysrc_py/untitled0_class.py" , line 111 , in <module> sx.print_SubX() File "F:/Python/hysrc_py/untitled0_class.py" , line 57 , in print_SubX self .print_x() File "F:/Python/hysrc_py/untitled0_class.py" , line 24 , in print_x print self .x AttributeError: 'SubClassX' object has no attribute 'x' >>> |
错误提示:属性错误:'SubClassX' 对象 没有属性 'x'