Python 继承与多继承
相关知识点:
__class__.__name__的用法。
>>> class ABC:
def func(self):
print('打印类名:',__class__.__name__) #__class__一个类实例所属的类对象,__name__类或者函数的名字 >>> a = ABC() #实例化一个对象
>>> a.func() #使用实例调用函数,通过__class__.__name__这个方法,会打印出实例 a 所属的类的名字
打印类名: ABC
>>>
raise 方法:
>>> 1/0 #程序的异常
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
1/0
ZeroDivisionError: division by zero
>>> raise ZeroDivisionError('division by zero') #使用raise,自动丢出异常(人为异常/自动异常)
Traceback (most recent call last):
File "<pyshell#15>", line 1, in <module>
raise ZeroDivisionError('division by zero')
ZeroDivisionError: division by zero
>>>
练习:
假设你正在参与一个魔幻类角色游戏的开发,公司需要你为这个游戏设计两个角色的类:
1.剑士
具有如下属性:
角色名
角色等级
生命值
攻击力
具有如下行为:
物理攻击
2.法师
具有如下属性:
角色名
角色等级
生命值
法术强度
具有如下行为:
法术攻击
治疗
练习题解答1:
剑士和法师单纯创建两个类,每个里面的属性也不一样。这两个类中有大量重复的代码,有有优化空间。
>>> class JS: #剑士
def __init__(self,name,level,blood,attack_power):
self.name = name
self.level = level
self.blood = blood
self.attack_power = attack_power
def fight(self): #方法
print('剑士:用剑攻击')
def __repr__(self): #__str__没有的时候,会去找__repr__
#使用'{}{}'.format(a,b)这种方式格式化字符串.
return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
name=self.name,
level=self.level,
blood=self.blood) >>>
class FS: #法师
def __init__(self,name,level,blood,magic_power):
self.name = name
self.level = level
self.blood = blood
self.magic_power = magic_power
def fight(self):
print('法师:用法术攻击')
def cure(self):
print('治疗')
def __repr__(self): #__str__没有的时候,会去找__repr__
return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
name=self.name,
level=self.level,
blood=self.blood) >>> a = JS('寒冰射手',18,500,100) #实例化对象a,因为类JS里面有__init__这个实例初始化函数,所以在实例对象时,必需传参数。
>>> print(a) #__repr__方法中 没有return power的参数,所以不会返回100
JS(姓名:寒冰射手,等级:18,血量:500)
>>> a.fight() #使用实例调用类中的fight(self)方法。会把实例a自己传入到函数里面。
剑士:用剑攻击
>>> b.fight() #法师这个类也可以有同样的操作
法师:用法术攻击
>>>
继承关系图:

练习题解答2:
为了方便代码的管理和修改,这里会使用继承来解决这个练习题。
>>> class Role: #定义一个角色的类,这个类拥有剑士和法师共有的属性。
def __init__(self,name,level,blood):
self.name = name
self.level = level
self.blood = blood
def fight(self):
raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现(因为剑士和法师攻击技能不一样,没有共同的属性)。
def __repr__(self): #__str__没有的时候,会去找__repr__
#使用'{}{}'.format(a,b)这种方式格式化字符串.
return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
name=self.name,
level=self.level,
blood=self.blood) >>> class JS(Role): #创建一个法师的类,同时继承角色这个类;不管是剑士还是法师都应该继承一个有共同属性的类。
#这样后续就很好扩展。比如有上百个游戏人物角色,直接继承一个有共同属性的类(如:Role)。
pass >>> class FS(Role): #继承以后,什么都不用做,这个FS和Role的功能是一样的。
pass >>> a = JS('寒冰射手',18,500)
>>>
>>> print(a)
Role(姓名:寒冰射手,等级:18,血量:500)
>>> a.fight() #目前这个剑士还没有攻击的能力,因为当前剑士这个类里面没有任何方法,
#而继承的类Role里面定义的fight(self)方法设置了主动报异常的警告。因为Role是公共的属性,它不好定义剑士和法师是如何攻击的。
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
a.fight() #目前这个剑士还没有攻击的能力,因为当前剑士这个类里面没有任何方法,
File "<pyshell#1>", line 7, in fight
raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现。
NotImplementedError: 攻击没有实现 >>>
练习题解答3:
使用 继承 + 重写 丰富属性方法。
class Role: #定义一个有共同属性的类
def __init__(self,name,level,blood):
self.name = name
self.level = level
self.blood = blood
def fight(self):
raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现。
def __repr__(self): #__str__没有的时候,会去找__repr__
#使用'{}{}'.format(a,b)这种方式格式化字符串.
return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
name=self.name,
level=self.level,
blood=self.blood) >> class JS(Role): #创建一个剑士的类,同时继承角色这个类;不管是剑士还是法师都应该继承一个有共同属性的类。
#这样后续就很好扩展。比如有上百个游戏人物角色,直接继承一个有共同属性的类(如:Role)。
#继承以后,什么都不用做,这个FS和Role的功能是一样的。
def __init__(self,name,level,blood,js_power): #不管如何,初始化方法__init__必须有。
Role.__init__(self,name,level,blood) #公共的部分使用父类Role去初始化。
self.js_power = js_power #单独的属性自己初始化
def fight(self): #父类里面有的,子类里面在写一次,叫做重写,最终只会用子类的了。
print('%s是:物理攻击'%(self.name)) >>> class FS(Role): #创建一个法师的类,同时继承角色这个类
def __init__(self,name,level,blood,fs_power): #不管如何,初始化方法__init__必须有。
Role.__init__(self,name,level,blood) #公共的部分使用父类Role去初始化。
self.fs_power = fs_power #单独的属性自己初始化.
def fight(self):
print('%s是:法术攻击' % (self.name))
def cure(self):
print('%s: 有治疗术,剑士没有!'%(self.name)) >>> a = JS('寒冰射手',18,500,130) #目前JS这个类初始化已经重写,增加了js_power参数。
>>> print(a)
Role(姓名:寒冰射手,等级:18,血量:500)
>>> a.fight()
寒冰射手是:物理攻击
>>>
>>>
>>> b = FS('流浪',18,500,150) #目前FS这个类初始化也已经重写,增加了fs_power参数。
>>> print(b)
Role(姓名:流浪,等级:18,血量:500)
>>> b.fight()
流浪是:法术攻击
>>> b.cure()
流浪: 有治疗术,剑士没有!
>>>
Python 继承与多继承的更多相关文章
- 深入super,看Python如何解决钻石继承难题 【转】
原文地址 http://www.cnblogs.com/testview/p/4651198.html 1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...
- python作用域和多继承
python作用域 python无块级作用域 看c语言代码: #include<stdio.h> int main() { > ) { ; } printf("i = %d ...
- 【python】类的继承和多态
比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print 'Animal is r ...
- python中使用多继承
python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...
- 深入super,看Python如何解决钻石继承难题
1. Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...
- Python中类的__init__继承
Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...
- Python设计模式 - 基础 - 封装 & 继承 & 多态
面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...
- python语法基础-初始化/继承
写了一些程序,基本上都是直接def函数 然后在main方法中 调用 但是在一些应用程序中 会有基本语法的使用(初始化,继承) 初始化: 1.在程序执行时一定执行一次的操作 2.python中初始化in ...
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- day25 python学习 继承,钻石继承 多态
---恢复内容开始--- 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' d ...
随机推荐
- hive之窗口函数
窗口函数 1.相关函数说明 COVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化 CURRENT ROW:当前行 n PRECEDING:往前n行数据 n FOLLO ...
- 【Excel】绘图案例_常见复合图:簇状图+堆积图+折线图
前言 最近有朋友让我帮忙用excel画图,老实说我很讨厌用excel画图,点来点去,复杂一些还不能复用,非常繁琐.当然,入门也很简单.需求时不同城市.不同产品的2016和2017销量及环比数据,这应该 ...
- 《汇编语言 基于x86处理器》第八章高级过程部分的代码 - 两种规范计算数组元素的和
▶ 输入 Count 个 32 位有符号整数,计算他们的和 ● 代码,使用堆栈传参 ;// Sum_main.asm,主过程 INCLUDE Irvine32.inc EXTERN PromptFor ...
- 学python的第二天
我是一个有一点点c语言基础的大二学生,今天的积累 cd指令=change directory(目录) dir=查看当前目录文件列表 convert 转化 defind 定义 cd .. ...
- spark基础知识介绍(包含foreachPartition写入mysql)
数据本地性 数据计算尽可能在数据所在的节点上运行,这样可以减少数据在网络上的传输,毕竟移动计算比移动数据代价小很多.进一步看,数据如果在运行节点的内存中,就能够进一步减少磁盘的I/O的传输.在spar ...
- kotlin学习(二)——类
Kotlin中的类遵循一个简单的结构.尽管与Java有一点细微的差别.你可以使用try.kotlinlang.org在不需要一个真正的项目和不需要部署到机器的前提下来测试一些简单的代码范例. 1. 怎 ...
- django之ForNode是如何渲染的
django的模板编译后变成一般text.tag.varible,然后根据上下文进行渲染. class ForNode(Node): child_nodelists = ('nodelist_l ...
- linux驱动开发(三) 字符设备驱动框架
还是老规矩先上代码 demo.c #include <linux/init.h> #include <linux/module.h> #include <linux/ke ...
- react-native Animated, 旋转动画
Animated 仅封装了四个可以动画化的组件: View.Text.Image.ScrollView 可以使用 Animated.createAnimatedComponent()来封装你自己的组件 ...
- nginx 和 php超时设置
nginx.conf --- http节: keepalive_timeout 600; #客户端浏览器超时时间fastcgi_connect_timeout 600; #php-fpm连接超时时间 ...