摘要:本文主要介绍了python中类的继承,同样在c++中已经对继承有了一定的了解,所以主要了解使用方法即可。
1、继承的初体验
1 class father(object): 2 def __init__(self,name,age): 3 self.name=name 4 self.age=age 5 def show(self): 6 print(self.name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class son(father): #注意继承的格式 12 pass #完全继承了父类,自己没有属性 13 14 son1=son('Tom',18) 15 son1.show()
执行的结果如下:
1 Tom 2 18 3 内存被收回
2、多继承
上面的例子其实是一个单继承的方法,下面介绍一下多继承。所谓多继承就是子类继承了多个父类。需要注意的是,发生多继承时,如果继承了多个同名的父类的方法,默认调用继承位置靠前的父类的方法。
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 def show(self): 6 print(self.name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class mother(object): 12 def __init__(self): 13 self.name='Lucy' 14 self.age=29 15 def show(self): 16 print(self.name) 17 print(self.age) 18 def __del__(self): 19 print('内存被收回') 20 21 class son(father,mother): #注意多继承的格式 22 pass #完全继承了父类,自己没有属性 23 class daughter(mother,father): 24 pass 25 26 son1=son() 27 son1.show() 28 29 daughter1=daughter() 30 daughter1.show()
执行结果如下:
1 Tom 2 30 3 Lucy 4 29 5 内存被收回 6 内存被收回
3、在子类中重写父类方法
所谓重写父类方法,就是在子类中重新定义和父类中同样名字的方法,并且要注意的是,在将子类对象化以后,调用这个方法,就会默认调用重写的方法:
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 def show(self): 6 print(self.name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class mother(object): 12 def __init__(self): 13 self.name='Lucy' 14 self.age=29 15 def show(self): 16 print(self.name) 17 print(self.age) 18 def __del__(self): 19 print('内存被收回') 20 21 class daughter(mother,father): 22 def __init__(self): #重写了方法 23 self.name='King' 24 self.age=10 25 def show(self): 26 print(self.name) 27 print(self.age) 28 def __del__(self): 29 print('内存被收回') 30 31 daughter1=daughter() 32 daughter1.show()
执行结果如下:
1 King 2 10 3 内存被收回
4、利用_mro_方法来了解继承关系
这个方法在c++中是没有的。直接对类调用该方法就会打印出各个类之间的继承关系:
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 def show(self): 6 print(self.name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class mother(object): 12 def __init__(self): 13 self.name='Lucy' 14 self.age=29 15 def show(self): 16 print(self.name) 17 print(self.age) 18 def __del__(self): 19 print('内存被收回') 20 21 class daughter(mother,father): 22 def __init__(self): #重写了方法 23 self.name='King' 24 self.age=10 25 def show(self): 26 print(self.name) 27 print(self.age) 28 def __del__(self): 29 print('内存被收回') 30 31 daughter1=daughter() 32 daughter1.show() 33 print(daughter.__mro__)
执行结果如下:
1 King 2 10 3 (<class '__main__.daughter'>, <class '__main__.mother'>, <class '__main__.father'>, <class 'object'>) 4 内存被收回
5、在子类中调用父类同名方法和属性
在上面的第3小节中,我们在子类中写了和父类中同名的方法以后,继承以后就会默认调用子类的方法,但是有时候又需要从子类的对象下调用父类的方法,这个时候就需要在子类中重新定义相关方法来达到这一目的:
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 def show(self): 6 print(self.name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class mother(object): 12 def __init__(self): 13 self.name='Lucy' 14 self.age=29 15 def show(self): 16 print(self.name) 17 print(self.age) 18 def __del__(self): 19 print('内存被收回') 20 21 class daughter(mother,father): 22 def __init__(self): #重写了方法 23 self.name='King' 24 self.age=10 25 def show(self): 26 print(self.name) 27 print(self.age) 28 def father_show(self): #重新写函数,为了调用父类的同名方法 29 father.__init__(self) 30 father.show(self) 31 def __del__(self): 32 print('内存被收回') 33 34 daughter1=daughter() 35 daughter1.show() 36 daughter1.father_show()
执行结果如下:
1 King 2 10 3 Tom 4 30 5 内存被收回
6、多层继承
上面的例子都是两层继承关系,下面让我们体验一下多层继承:
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 self.id='12345678' 6 def show(self): 7 print(self.name) 8 print(self.age) 9 print(self.id) 10 def __del__(self): 11 print('内存被收回') 12 13 class mother(object): 14 def __init__(self): 15 self.name='Lucy' 16 self.age=29 17 def show(self): 18 print(self.name) 19 print(self.age) 20 def __del__(self): 21 print('内存被收回') 22 23 class daughter(father,mother): 24 pass 25 26 class grandson(daughter): #这个‘孙子类’继承了子类,那么也就继承了父类 27 pass 28 29 grandson1=grandson() 30 grandson1.show()
执行结果如下:
1 Tom 2 30 3 12345678 4 内存被收回
7、super()方法
在上面的例子中,我们想要调用父类同名的方法的时候,需要重写一遍,这显然比较麻烦,所以创造了super方法,可以更加简单的调用父类的方法:
1 class father(object): 2 def __init__(self): 3 self.name='Tom' 4 self.age=30 5 self.id='12345678' 6 def show(self): 7 print(self.name) 8 print(self.age) 9 print(self.id) 10 def __del__(self): 11 print('内存被收回') 12 13 14 class daughter(father): 15 def __init__(self): 16 self.name='King' 17 self.age=18 18 self.id='23467' 19 def show(self): 20 print(self.name) 21 print(self.age) 22 print(self.id) 23 super().__init__() 24 super().show() 25 def __del__(self): 26 print('内存被收回') 27 28 class grandson(daughter): 29 def __init__(self): 30 self.name = 'Jone' 31 self.age = 9 32 self.id = '2346787' 33 34 def show(self): 35 print(self.name) 36 print(self.age) 37 print(self.id) 38 # super(grandson,self).__init__() #带参数的写法 39 # super(grandson,self).show() 40 super().__init__() 41 super().show() 42 43 def __del__(self): 44 print('内存被收回') 45 46 grandson1=grandson() 47 grandson1.show()
执行结果如下:
1 Jone 2 9 3 2346787 4 King 5 18 6 23467 7 Tom 8 30 9 12345678 10 内存被收回
8、python中的私有属性无法类外访问
当父类有部分的属性或者方法不想在类外被访问时,可以把属性和方法设置成私有属性,具体的方法就是在属性和方法名前面添加双下划线:__
class father(object): def __init__(self): self.__name='Tom' self.age=18 def __show(self): print(self.__name) print(self.age) def __del__(self): print('内存被收回') class son(father): #注意继承的格式 pass #完全继承了父类,自己没有属性 son1=son() #print(son1.__name) 无法继承属性 #son1.__show() 无法继承方法
上面的代码执行出错!
其实上面的原因就是,私有的属性和函数不可以在类外访问,道理和下面的例子是一样的:
1 class father(object): 2 def __init__(self): 3 self.__name='Tom' 4 self.age=18 5 def __show(self): 6 print(self.__name) 7 print(self.age) 8 def __del__(self): 9 print('内存被收回') 10 11 class son(father): #注意继承的格式 12 pass #完全继承了父类,自己没有属性 13 14 father1=father() 15 print(father1.age) #18 16 #print(father1.__name) 无法访问
当我们想要访问的时候,可以用类内的方法set和get来完成,这一点和c++是一样的。