继承
Python也是面向对象的语言。
面向对象的一个特点是对代码重用,重用的一种实现方法就是通过继承机制。与java中概念相似,有父类型与子类型的概念。
现在书中的例子:
学校中有两种类型的人:老师、学生。
他们有一些共同的特征:姓名、年龄、地址。
老师还有一些特有的特征:薪水,课程,假期;学生的特有特征:成绩、学费。
当然,可以分别写两个类:老师的类,学生的类。
但如果又要增加一个特征,比如:性别,这样需要在老师的类中加上这个属性,也需要在学生的类中加上这个属性。这样就比较繁琐。
有没有办法优化呢?
可以把老师、学生的共同特征,提取出来,新建一个类,SchoolMember。这个类中放的是学校成员共同的一些特征:姓名、年龄、地址、性别等
再新建老师的类:Teacher,
学生的类:Student,分别继承SchoolMember这个类,同时也加上各自的属性。
基类代码SchoolMember如下:
class SchoolMember: # 代表任何学校里的成员 def __init__(self, name, age): self.name = name self.age = age print 'Initialized SchoolMember:{}'.format(self.name) def tell(self): print 'Name:"{}" Age:"{}"'.format(self.name, self.age)
教师类Teacher代码如下:
class Teacher(SchoolMember): # 代表一位老师 def __init__(self, name, age, salary): SchoolMember.__init__(self, name, age) self.salary = salary print 'Initialized Teacher:{}'.format(self.name) def tell(self): SchoolMember.tell(self) print 'Salary: "{:d}"'.format(self.salary)
学生类Student代码如下:
class Student(SchoolMember): def __init__(self, name, age, marks): SchoolMember.__init__(self, name, age) self.marks = marks print 'Initialized Student: {}'.format(self.name) def tell(self): SchoolMember.tell(self) print 'Marks: "{:d}"'.format(self.marks)
调用的代码如下:
t = Teacher('Mrs. Shriviya', 40, 3000) s = Student('Swaroop', 25, 75) print '' members = [t, s] for member in members: member.tell()
运行后结果如下:
---------------------------------------------------------------
Initialized SchoolMember:Mrs. Shriviya
Initialized Teacher:Mrs. Shriviya
Initialized SchoolMember:Swaroop
Initialized Student: Swaroop
Name:"Mrs. Shriviya" Age:"40"
Salary: "3000"
Name:"Swaroop" Age:"25"
Marks: "75"
---------------------------------------------------------------
注意:
java和python中继承的区别:
java中a.class继承了b.class,那么在子类a的构造函数中,无论什么情况,都会自动的调用父类b的构造函数。
而python的子类,如果子类,如Teacher类,已经写了构造函数__init__(),则需要显示的调用父类的构造函数__init__(self),否则不会调用。
但如果子类,Teacher类,并没有再定义构造函数__init__(),那么会默认的调用父类的构造函数。
多重继承:如果类定义的时候,
class Teacher(class1,class2...),写了多个继承元组,这种就是多重继承。