概要

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

 


新建一个基类

代码如下:

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. OC 中的 weak 属性是怎么实现的?

    OC 中的 weak 属性是怎么实现的,为什么在对象释放后会自动变成 nil?本文对这个问题进行了一点探讨.环境 mac OS Sierra 10.12.4 objc709参考答案 搜索后发现runt ...

  2. msyql分区与分库分表

    分区 工作原理 对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件. 如果数据量比较大,可以进行分区.分区对PHP ...

  3. 外企面试,哪有你想象的那么难!(已收埃森哲、NTTDATA等8家外企offer)

    无精疯,一名背包客,大学期间穷游了十余个国家,五十余座城市,也是一位拥有健身教练证的业余健身痴迷者.从大二开始自学Java并开始了第一份实习,后面也是通过自学转到了大数据,之前在一家大数据独角兽实习, ...

  4. IE浏览器不支持Promise对象

    1. 安装babel-polyfill插件转换 npm install --save-dev babel-polyfill 2. 在webpack中引入babel-polyfill 在webpack. ...

  5. 洛谷 P1365 WJMZBMR打osu! / Easy

    题目背景 原 维护队列 参见P1903 题目描述 某一天\(WJMZBMR\)在打\(osu~~~\)但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有\(n\)次点击要做,成功 ...

  6. STP-18-Port-Channl上的负载均衡

    Ether Channel通过在多条链路上传输多个数据帧,增加了可用带宽.一个以太网帧总是通过一个Ether Channel中的一条链路传输.针对数据帧地址字段执行散列计算能够产生一个编号,标识这个数 ...

  7. EcmaScript内置对象的属性与方法

  8. Javascript专题(一)严格模式

    严格模式是干什么的?它从哪里来? ECMAScript5中引入了严格模式.它为JS定义了一种不同的解析和执行模型. 摘自阮一峰博客:http://www.ruanyifeng.com/blog/201 ...

  9. Spark编程模型(中)

    创建RDD 方式一:从集合创建RDD makeRDD Parallelize 注意:makeRDD可以指定每个分区perferredLocations参数parallelize则没有. 方式二:读取外 ...

  10. [转]logX<X对所有的X>0成立

    本文引用地址:http://blog.sciencenet.cn/blog-1865911-831450.html 此文来自科学网何召卫博客,转载请注明出处. 这个命题网上有多种证法,有人甚至采用斜率 ...