简明 Python 教程
第11章 面向对象的编程
上一页 继承 下一页

继承

面向对象的编程带来的主要好处之一是代码的重用,时时彩计划软件公式:实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。

假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和地址。他们也有专有的属性,比如教师的薪水、课程和假期,学生的成绩和学费。

你可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就意味着要在这两个独立的类中都增加这个属性。这很快就会显得不实用。

一个比较好的方法是创建一个共同的类称为SchoolMember然后让教师和学生的类 继承 这个共同的类。即它们都是这个类型(类)的子类型,然后我们再为这些子类型添加专有的属性。

使用这种方法有很多优点。如果我们增加/改变了SchoolMember中的任何功能,它会自动地反映到子类型之中。例如,你要为教师和学生都增加一个新的身份证域,那么你只需简单地把它加到SchoolMember类中。然而,在一个子类型之中做的改动不会影响到别的子类型。另外一个优点是你可以把教师和学生对象都作为SchoolMember对象来使用,这在某些场合特别有用,比如统计学校成员的人数。一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象

另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。

在上述的场合中,SchoolMember类被称为 基本类超类 。而TeacherStudent类被称为 导出类子类

现在,我们将学习一个例子程序。

使用继承

例11.5 使用继承

#!/usr/bin/python
# Filename: inherit.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 my 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

class Student(SchoolMember):
    '''Represents a student.'''
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self, name, age)
        self.marks = marks

        print '(Initialized Student: %s)' % self.name

    def tell(self):
        SchoolMember.tell(self)

        print 'Marks: "%d"' % self.marks

t = Teacher(
'Mrs. Shrividya', 40, 30000)
s = Student(
'Swaroop', 22, 75)

print # prints a blank line

members = [t, s]
for member in members:
    member.tell()
# works for both Teachers and Students

(源文件:code/inherit.py

输出

$ python inherit.py
(Initialized SchoolMember: Mrs. Shrividya)
(Initialized Teacher: Mrs. Shrividya)
(Initialized SchoolMember: Swaroop)
(Initialized Student: Swaroop)

Name:"Mrs. Shrividya" Age:"40" Salary: "30000"
Name:"Swaroop" Age:"22" Marks: "75"

它如何工作

为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__方法专门使用self变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它。

我们还观察到我们在方法调用之前加上类名称前缀,然后把self变量及其他参数传递给它。

注意,在我们使用SchoolMember类的tell方法的时候,我们把TeacherStudent的实例仅仅作为SchoolMember的实例。

另外,在这个例子中,我们调用了子类型的tell方法,而不是SchoolMember类的tell方法。可以这样来理解,Python总是首先查找对应类型的方法,在这个例子中就是如此。如果它不能在导出类中找到对应的方法,它才开始到基本类中逐个查找。基本类是在类定义的时候,在元组之中指明的。

一个术语的注释——如果在继承元组中列了一个以上的类,那么它就被称作 多重继承


上一页 上一级 下一页
类与对象的变量 首页 概括
时时彩计划软件公式
@ssv
时时彩走势图什么看 凤凰时时彩平台客户端 如何制作时时彩平台 天恒时时彩演示 宿迁领航软件官网
领航时时彩软件lm0 重庆时时彩定独胆技巧 澳门银座时时彩 江西时时彩开奖haoma 江西时时彩官网犯法吗
时时彩软件连错 时时彩计划器自动群发 时时彩官方开奖视频 时时彩表格制作 abc娱乐平台注册
时时彩后三缩水 时时彩高赔率代理 时时彩对码是什么意思 内蒙古时时彩软件 重庆时时彩求黑客合作
江西十一选五投注 贵州11选5杀号技巧 时时彩五星不定位 老公赚钱老婆花 今天河北体彩十一选五开奖
云南快乐10分预测 二十一点规则 重庆时时彩官方客户端 上海十一选五任选二 幸运飞艇官网
内蒙古十一选五pc 广西快乐双彩开奖号码 幸运28挂机模式 甘肃快3基本走势 贵州11选5玩法
新疆35选7福利彩票 北京赛车pk10.041.net 上海十一选五技巧视频 北京赛车 山东11选5万能号码