python每日学习 2

继承

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中继承的区别

javaa.class继承了b.class,那么在子类a的构造函数中,无论什么情况,都会自动的调用父类b的构造函数

python的子类,如果子类,如Teacher类,已经写了构造函数__init__(),则需要显示的调用父类的构造函数__init__(self),否则不会调用。

如果子类,Teacher类,并没有再定义构造函数__init__()那么会默认的调用父类的构造函数

多重继承:如果类定义的时候,

class Teacher(class1,class2...),写了多个继承元组,这种就是多重继承。

猜你喜欢

转载自sanatay.iteye.com/blog/2412661