类的继承指的是在已有的类上增加新的类。比如,假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和地址。他们也有专有的属性,比如教师的薪水、课程和假期,学生的学号和成绩。也就是说姓名、年龄和地址为共同的类,而薪水、课程为教师独有的类,学号和成绩为学生独有的类。那么就可以先建立一个共同的类SchoolMember,包含姓名、年龄和地址属性,然后为老师建立一个 Teacher 类,包含薪水、课程等属性,为学生建立一个 Student 类,包含学号和成绩等属性。Teacher 和 student 都是从 SchoolMember 中继承出来的,这样二者也就包含了 姓名、年龄和地址等属性。
具体可以先看看下例:
# Filename : inherit_test.py
class SchoolMember:
'''Represents any school member.'''
def __init__(self, name, age):
self.name = name
self.age = age
print '(Initialized SchoolMember:%s)' %self.name
def tell(self):
'''Tell the details.'''
print 'Name:"%s", Age:"%s"' %(self.name, self.age)
class Teacher(SchoolMember):
'''Represents a teacher'''
def __init__(self, name, age, salary):
SchoolMember.__init__(self,name,age)
self.salary = salary
print '(Initialized Teacher: %s)' %self.name
def tell(self):
SchoolMember.tell(self)
print 'Salary: "%d"' %self.salary
print # prints a blank line
class Student(SchoolMember):
'''Represents a student'''
def __init__(self, name, age, marks, score):
SchoolMember.__init__(self,name,age)
self.marks = marks
self.score = score
print '(Initialized Student: %s)' %self.name
def tell(self):
SchoolMember.tell(self)
print 'Marks:"%d", Score:"%d"' %(self.marks,self.score)
teachers = Teacher('Pro. Phoenix', 33, 50000)
students = Student('Tree', 23, 2120130992, 98)
print # prints a blank line
members = [teachers, students]
for member in members:
member.tell()
输出为
这里,我们继承的书写方式是
SchoolMember.__init__(self,name,age)
还有一种方式是
super(Teacher, self).__init__(name, gender)
判断类型
可以通过 函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。
例如我们对上例的基础上再做如下判断:
peopple = SchoolMember('Someone',30)
print isinstance(peopple,SchoolMember)
print isinstance(peopple,Teacher)
print isinstance(peopple,Student)
print isinstance(teachers,SchoolMember)
print isinstance(teachers,Teacher)
print isinstance(teachers,Student)
print isinstance(teachers, object)
输出为
True
False
False
True
True
False
True
多态和多重继承
第一个例子中,有一个 tell()在父类和子类里都出现了。这种表达称为多态。一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象。
class Person(object):
pass
class Student(Person):
pass
class Teacher(Person):
pass
class SkillMixin(object):
pass
class BasketballMixin(SkillMixin):
def skill(self):
return 'basketball'
class FootballMixin(SkillMixin):
def skill(self):
return 'football'
class BStudent(Student, BasketballMixin):
pass
class FTeacher(Teacher, FootballMixin):
pass
s = BStudent()
print s.skill()
t = FTeacher()
print t.skill()
上例多重继承可以用下图表示