Python学习笔记--类(继承)

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”,继承的过程,就是从一般到特殊的过程。在某些 OOP 语言中,一个子类可以继承多个基类。但是一般情况下,一个子类只能有一个基类,要实现多重继承,可以通过多级继承来实现。

先看看下面的继承例子:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 # @Date    : 2020-03-09 17:19:00
 4 # @Author  : Flyinghappy (671474@qq.com)
 5 # @Link    : https://www.cnblogs.com/flyinghappy/
 6 # @Version : $Id$
 7 
 8 import os
 9 
10 class SchoolMember():
11     '''定义一个学校成员基类'''
12     number = 0 #类属性
13     def __init__(self,name,age,sex):
14         self.name = name
15         self.age = age
16         self.sex = sex
17         self.enroll()#初始化实例的时候调用,即新增一个实例就类属性number+1
18     def enroll(self):
19         '''注册新的成员'''
20         print('enroll a new SchoolMember:',self.name)
21         SchoolMember.number += 1
22     def show(self):
23         print(self.name)
24         for key,value in self.__dict__.items():#内部已经将name,age,sex等属性存储为字典了
25             print(key,value)
26     def __del__(self):#删除实例。
27         print('父类开除',self.name)
28         SchoolMember.number -= 1
29 class Teacher(SchoolMember):#子类--老师
30     def __init__(self, name, age, sex, salary, course):
31         SchoolMember.__init__(self, name, age, sex)#继承了父类的name,age,sex属性
32         self.salary = salary#老师类的新增属性
33         self.course = course#老师类的新增属性
34     def teaching(self):#新增方法
35         print('Teacher [%s] is teaching [%s]' % (self.name, self.course))
36     def __del__(self):#删除实例。重写了父类del方法
37         print('老师类开除',self.name)
38         SchoolMember.number -= 1
39 
40 class Student(SchoolMember):#子类--学生
41   def __init__(self, name, age, sex, course, tuition):
42         SchoolMember.__init__(self, name, age, sex)#继承了父类的name,age,sex属性
43         self.course = course#新增属性
44         self.tuition = tuition#新增属性
45         self.amount = 0#新增属性
46   def pay_tuition(self, amount):#新增方法
47     print('student [%s] has just paied [%s]' % (self.name, amount))
48     self.amount += amount
49   def __del__(self):#删除实例。重写了父类del方法
50       print('学生类开除',self.name)
51       SchoolMember.number -= 1
52 
53 t1 = Teacher('Wusir', 28, 'M', 3000, 'python')
54 t1.show()
55 s1 = Student('haitao', 38, 'M', 'python', 30000)
56 s1.show()
57 s2 = Student('lichuang', 12, 'M', 'python', 11000)
58 print(SchoolMember.number)
59 del s2
60 del s1
61 del t1
62 print(SchoolMember.number)

输出结果:大家可以试试59-61行代码改成只删除一个实例,看看输出结果。其实结果是__del__调用了三次

 

posted @ 2020-03-09 19:19  flyinghappy  阅读(111)  评论(0)    收藏  举报