假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和地址。他们也有专有的属性,比如教师的薪水、课程和假期,
学生的成绩和学费。
可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就意味着要在这两个独立的类中都增加这个属性。这很快就会
显得不实用。
一个比较好的方法是创建一个共同的类称为SchoolMember然后让教师和学生的类 继承 这个共同的类。即它们都是这个类型(类)的子类型,然后我们再为这些子
类型添加专有的属性。
使用这种方法有很多优点。如果我们增加/改变了SchoolMember中的任何功能,它会自动地反映到子类型之中。例如,你要为教师和学生都增加一个新的身份证域,那么你只需简单地把它加到SchoolMember类中。然而,在一个子类型之中做的改动不会影响到别的子类型。另外一个优点是你可以把教师和学生对象都作为SchoolMember对象来使用,这在某些场合特别有用,比如统计学校成员的人数。一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。
另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。
在上述的场合中,SchoolMember类被称为 基本类 或 超类 。而Teacher和Student类被称为 导出类 或 子类 。
例:使用继承
#!/usr/bin/python
class SchoolMember:
def __init__(self,name,age):
self.name=name
self.age=age
print '(Initialing SchoolMember:%s)' %self.name
def tell(self):
print 'Name:"%s" Age:"%d"' %(self.name,self.age),
class Teacher(SchoolMember):
def __init__(self,name,age,salary):
SchoolMember.__init__(self,name,age)
self.salary=salary
print '(Initialing Teacher: %s)' %self.name
def tell(self):
SchoolMember.tell(self)
print 'Salary :"%d"' %self.salary
class Student(SchoolMember):
def __init__(self,name,age,marks):
SchoolMember.__init__(self,name,age)
self.marks=marks
print '(Initialing Student: %s)' %self.name
def tell(self):
SchoolMember.tell(self)
print 'Marks:"%d"' %self.marks
t=Teacher('Zhang San',35,50000)
s=Student('Han Mei',18,90)
print '**************************'
members=[t,s]
for member in members:
member.tell()
运行输出:
shiyan@ubuntu:~/Desktop/study/pythonLearn$ ./inherit.py
(Initialing SchoolMember:Zhang San)
(Initialing Teacher: Zhang San)
(Initialing SchoolMember:Han Mei)
(Initialing Student: Han Mei)
**************************
Name:"Zhang San" Age:"35" Salary :"50000"
Name:"Han Mei" Age:"18" Marks:"90"
shiyan@ubuntu:~/Desktop/study/pythonLearn$