python之对象的继承

摘要:本文主要介绍了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++是一样的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值