概要

如果要修改现有类的行为,我们不必再从头建一个新的类,可以直接利用继承这一功能。下面将以实例相结合介绍继承的用法。

 


新建一个基类

代码如下:

class Marvel(object):
num_presents = 0 # 类变量,统计类实例中记录的作品数量
def __init__(self, film_name, role):
"""
file_name: 影名,字符串
role: 影片角色,列表
"""
self.film_name = film_name
self.role = role
Marvel.num_presents += 1
def __del__(self): # 调用 del 方法删除类实例时,作品数量同时-1
Marvel.num_presents -= 1
def add_role(self, name):
self.role.append(name)
def reduce_role(self, name):
self.role.remove(name)
def inquiry(self, name):
return name in self.role

上述代码中的类声明也可以省略写成 class Marvel:, 因为 object 是所有 Python 对象的根类。

其中 num_presents 是类变量,它是在类的所有实例之间共享的值。可以通过实例名或者类名 + . 的方式访问该变量值。在我们的实例中,该类变量是统计我们记录的漫威作品数量,每次声明一个作品时,该值就会自动增一,而且如果我们调用 del 方法删除作品时,会自动减一。示例如下:

a = Marvel('Revengers-1', ['Iron Man', 'Cap'])  # 创建一个类实例
print(a.num_presents) # 输出 1 等价于 Marvel.num_presents
b = Marvel('Revengers-2', ['Hulk', 'Cap']) # 再创建一个类实例
print(a.num_presents) # 输出 2
del(a)
print(b.num_presents) # 输出 1

值得一提的是,如果你重复运行同样的程序(重复运行前内存中变量却没清除),小心输出的类变量值不一样。这就涉及了 python 的垃圾回收机制,简单地说,对于我们的实例,如果你对同样的变量名,比如 a,执行两次类实例声明操作,类变量的值 num_presents 不会变为 2,因为你再第二次赋值时,后台默认已经执行 del 方法回收了被覆盖掉的变量。

 

新建一个子类

class secondMarvel(Marvel):
def __init__(self, film_name, role, score):
Marvel.__init__(self, film_name, role) # 等价于 super().__init__(film_name, role)
self.score = score
def add_role(self, name):
if name in self.role:
print("Warning: ", name, 'already exists in role !')
super().add_role(name) # python 3 , python 2 用 super(secondMarvel, self).add_role(name)

在上述代码中,子类 secondMarvel 重新定义了 __init__ 函数,增加了一个属性 score(当然如果没必要增加属性,也就没必要重写该初始化函数)。而一旦重写了初始化函数,那么它不会自动调用基类的 __init__ 函数,所以我们要用显式地进行初始化声明(即 Marvel.__init__()),注意第一个参数是 self

另外我们改写了 add_role 方法,如果此时我们仍想调用基类中的方法实现,使用 super 方法即可。我们新写的方法只是打印出了警告而已。

 


总结

python 中的继承也支持多重继承,即一个子类可以同时有多个父类,此时如果继承的属性命名为惟一,搜索属性时会变得非常复杂,而实际应用中应该避免这种情况。本篇简单地介绍一下 python 中的继承机制以及了解其中一些实用技巧,在实际应用中可以多加尝试通过构建子类简化代码。

 

Python 之继承的更多相关文章

  1. sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO

    sqlalchemy mark-deleted 和 python 多继承下的方法解析顺序 MRO 今天在弄一个 sqlalchemy 的数据库基类的时候,遇到了跟多继承相关的一个小问题,因此顺便看了一 ...

  2. python基础——继承和多态

    python基础——继承和多态 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类.父类或超类 ...

  3. [修]python普通继承方式和super继承方式

    [转]python普通继承方式和super继承方式 原文出自:http://www.360doc.com/content/13/0306/15/9934052_269664772.shtml 原文的错 ...

  4. Python进阶-继承中的MRO与super

    Python进阶-继承中的MRO与super 写在前面 如非特别说明,下文均基于Python3 摘要 本文讲述Python继承关系中如何通过super()调用"父类"方法,supe ...

  5. python基础——继承实现的原理

    python基础--继承实现的原理 1 继承顺序 class A(object): def test(self): print('from A') class B(A): def test(self) ...

  6. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  7. python 类继承演示范例的代码

    把做工程过程重要的代码片段备份一次,下面的资料是关于python 类继承演示范例的代码. # a simple example of a class inheritance # tested with ...

  8. [py]python的继承体系-源码目录结构

    python3安装目录 pip install virtualenv pip install virtualenvwrapper pip install virtualenvwrapper-win m ...

  9. [py]python的继承体系

    python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...

  10. Python多继承解析顺序的C3线性算法流程解析

    Python多继承MRO 在Python2.1中,采用了经典类,使用深度优先算法解析. Python2.2中,引入了新式类,使用深度优先算法和广度优先算法. 在Python2.3以后的版本中,经典类和 ...

随机推荐

  1. 2017-10-7 清北刷题冲刺班a.m

    测试 A 消失的数字 文件名 输入文件 输出文件 时间限制 空间限制del.cpp/c/pas del.in del.out 1s 512MB题目描述现在,我的手上有 n 个数字,分别是 a 1 ,a ...

  2. bzoj3171: [Tjoi2013]循环格(费用流)

    传送门 其实这题的建图并不难(虽然我并没有想出来) 首先,每一个点的入度和出度必须为$1$ 那么我们考虑拆点 每个点的出度点向它能到达的点的入度点连边,容量$1$,如果方向为原来的方向则费用$0$否则 ...

  3. [Xcode 实际操作]五、使用表格-(4)设置UITableView单元格数据库源

    目录:[Swift]Xcode实际操作 本文将演示如何自定义表格的数据来源. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添加 ...

  4. 面向对象OO第三单元总结

    第三单元OO总结博客 1 梳理JML语言的理论基础.应用工具链情况 由于篇幅原因,这里只梳理几个在本单元常用的 注释结构 行注释://@annotation 块注释:/* @ annotation @ ...

  5. [JLOI2012]树 倍增优化

    题目描述 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深度为1.路径不 ...

  6. POJ2488 A Knight's Journey

    题目:http://poj.org/problem?id=2488 题目大意:可以从任意点开始,只要能走完棋盘所有点,并要求字典序最小,不可能的话就impossible: 思路:dfs+回溯,因为字典 ...

  7. 3、kvm配置vnc

    配置kvm通过vnc访问 virsh edit privi-server 添加如下配置: <graphics type='vnc' port='5901' autoport='no' liste ...

  8. ZC01

    1.苏州市住房公积金管理中心 http://www.szgjj.gov.cn/szgjj/ 2.苏州社保 http://www.szsbzx.net.cn:9900/web/website/index ...

  9. C. Glass Carving 正着做或者倒着做都可以

    http://codeforces.com/problemset/problem/527/C 这题总体思路就是,每画一条线,然后就找到x间距的最max值和y间距的最max值,相乘就是当前的ans 那么 ...

  10. (转)老男孩linux培训某节课前考试试题及答案分享

    目录:[考试目的] ................................2[考试范围]  ...............................2[答题策略] .......... ...