相关知识点:

__class__.__name__的用法。

  1. >>> class ABC:
  2. def func(self):
  3. print('打印类名:',__class__.__name__) #__class__一个类实例所属的类对象,__name__类或者函数的名字
  4.  
  5. >>> a = ABC() #实例化一个对象
  6. >>> a.func() #使用实例调用函数,通过__class__.__name__这个方法,会打印出实例 a 所属的类的名字
  7. 打印类名: ABC
  8. >>>

raise 方法:

  1. >>> 1/0 #程序的异常
  2. Traceback (most recent call last):
  3. File "<pyshell#14>", line 1, in <module>
  4. 1/0
  5. ZeroDivisionError: division by zero
  6. >>> raise ZeroDivisionError('division by zero') #使用raise,自动丢出异常(人为异常/自动异常)
  7. Traceback (most recent call last):
  8. File "<pyshell#15>", line 1, in <module>
  9. raise ZeroDivisionError('division by zero')
  10. ZeroDivisionError: division by zero
  11. >>>

  

  


练习:

假设你正在参与一个魔幻类角色游戏的开发,公司需要你为这个游戏设计两个角色的类:

1.剑士
具有如下属性:
  角色名
  角色等级
  生命值
  攻击力
具有如下行为:
  物理攻击

2.法师
具有如下属性:
  角色名
  角色等级
  生命值
  法术强度
具有如下行为:
  法术攻击
  治疗


练习题解答1:

剑士和法师单纯创建两个类,每个里面的属性也不一样。这两个类中有大量重复的代码,有有优化空间。

  1. >>> class JS: #剑士
  2. def __init__(self,name,level,blood,attack_power):
  3. self.name = name
  4. self.level = level
  5. self.blood = blood
  6. self.attack_power = attack_power
  7. def fight(self): #方法
  8. print('剑士:用剑攻击')
  9. def __repr__(self): #__str__没有的时候,会去找__repr__
  10. #使用'{}{}'.format(a,b)这种方式格式化字符串.
  11. return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
  12. name=self.name,
  13. level=self.level,
  14. blood=self.blood)
  15.  
  16. >>>
  17. class FS: #法师
  18. def __init__(self,name,level,blood,magic_power):
  19. self.name = name
  20. self.level = level
  21. self.blood = blood
  22. self.magic_power = magic_power
  23. def fight(self):
  24. print('法师:用法术攻击')
  25. def cure(self):
  26. print('治疗')
  27. def __repr__(self): #__str__没有的时候,会去找__repr__
  28. return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
  29. name=self.name,
  30. level=self.level,
  31. blood=self.blood)
  32.  
  33. >>> a = JS('寒冰射手',18,500,100) #实例化对象a,因为类JS里面有__init__这个实例初始化函数,所以在实例对象时,必需传参数。
  34. >>> print(a) #__repr__方法中 没有return power的参数,所以不会返回100
  35. JS(姓名:寒冰射手,等级:18,血量:500)

  36. >>> a.fight() #使用实例调用类中的fight(self)方法。会把实例a自己传入到函数里面。
  37. 剑士:用剑攻击
  38. >>> b.fight() #法师这个类也可以有同样的操作
  39. 法师:用法术攻击
  40. >>>

继承关系图:

练习题解答2:

为了方便代码的管理和修改,这里会使用继承来解决这个练习题。

  1. >>> class Role: #定义一个角色的类,这个类拥有剑士和法师共有的属性。
  2. def __init__(self,name,level,blood):
  3. self.name = name
  4. self.level = level
  5. self.blood = blood
  6. def fight(self):
  7. raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现(因为剑士和法师攻击技能不一样,没有共同的属性)。
  8. def __repr__(self): #__str__没有的时候,会去找__repr__
  9. #使用'{}{}'.format(a,b)这种方式格式化字符串.
  10. return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
  11. name=self.name,
  12. level=self.level,
  13. blood=self.blood)
  14.  
  15. >>> class JS(Role): #创建一个法师的类,同时继承角色这个类;不管是剑士还是法师都应该继承一个有共同属性的类。
  16. #这样后续就很好扩展。比如有上百个游戏人物角色,直接继承一个有共同属性的类(如:Role)。
  17. pass
  18.  
  19. >>> class FS(Role): #继承以后,什么都不用做,这个FS和Role的功能是一样的。
  20. pass
  21.  
  22. >>> a = JS('寒冰射手',18,500)
  23. >>>
  24. >>> print(a)
  25. Role(姓名:寒冰射手,等级:18,血量:500)
  26. >>> a.fight() #目前这个剑士还没有攻击的能力,因为当前剑士这个类里面没有任何方法,
  27. #而继承的类Role里面定义的fight(self)方法设置了主动报异常的警告。因为Role是公共的属性,它不好定义剑士和法师是如何攻击的。
  28. Traceback (most recent call last):
  29. File "<pyshell#14>", line 1, in <module>
  30. a.fight() #目前这个剑士还没有攻击的能力,因为当前剑士这个类里面没有任何方法,
  31. File "<pyshell#1>", line 7, in fight
  32. raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现。
  33. NotImplementedError: 攻击没有实现
  34.  
  35. >>>

练习题解答3: 

使用 继承 + 重写 丰富属性方法。

  1. class Role: #定义一个有共同属性的类
  2. def __init__(self,name,level,blood):
  3. self.name = name
  4. self.level = level
  5. self.blood = blood
  6. def fight(self):
  7. raise NotImplementedError('攻击没有实现') #Not Implemented Error 表示这个方式实现,还不能调用。必须要在 “子类”中实现。
  8. def __repr__(self): #__str__没有的时候,会去找__repr__
  9. #使用'{}{}'.format(a,b)这种方式格式化字符串.
  10. return '{cls}(姓名:{name},等级:{level},血量:{blood})'.format(cls=__class__.__name__,
  11. name=self.name,
  12. level=self.level,
  13. blood=self.blood)
  14.  
  15. >> class JS(Role): #创建一个剑士的类,同时继承角色这个类;不管是剑士还是法师都应该继承一个有共同属性的类。
  16. #这样后续就很好扩展。比如有上百个游戏人物角色,直接继承一个有共同属性的类(如:Role)。
  17. #继承以后,什么都不用做,这个FS和Role的功能是一样的。
  18. def __init__(self,name,level,blood,js_power): #不管如何,初始化方法__init__必须有。
  19. Role.__init__(self,name,level,blood) #公共的部分使用父类Role去初始化。
  20. self.js_power = js_power #单独的属性自己初始化
  21. def fight(self): #父类里面有的,子类里面在写一次,叫做重写,最终只会用子类的了。
  22. print('%s是:物理攻击'%(self.name))
  23.  
  24. >>> class FS(Role): #创建一个法师的类,同时继承角色这个类
  25. def __init__(self,name,level,blood,fs_power): #不管如何,初始化方法__init__必须有。
  26. Role.__init__(self,name,level,blood) #公共的部分使用父类Role去初始化。
  27. self.fs_power = fs_power #单独的属性自己初始化.
  28. def fight(self):
  29. print('%s是:法术攻击' % (self.name))
  30. def cure(self):
  31. print('%s: 有治疗术,剑士没有!'%(self.name))
  32.  
  33. >>> a = JS('寒冰射手',18,500,130) #目前JS这个类初始化已经重写,增加了js_power参数。
  34. >>> print(a)
  35. Role(姓名:寒冰射手,等级:18,血量:500)
  36. >>> a.fight()
  37. 寒冰射手是:物理攻击
  38. >>>
  39. >>>
  40. >>> b = FS('流浪',18,500,150) #目前FS这个类初始化也已经重写,增加了fs_power参数。
  41. >>> print(b)
  42. Role(姓名:流浪,等级:18,血量:500)
  43. >>> b.fight()
  44. 流浪是:法术攻击
  45. >>> b.cure()
  46. 流浪: 有治疗术,剑士没有!
  47. >>>

 

 

Python 继承与多继承的更多相关文章

  1. 深入super,看Python如何解决钻石继承难题 【转】

    原文地址 http://www.cnblogs.com/testview/p/4651198.html 1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通 ...

  2. python作用域和多继承

    python作用域 python无块级作用域 看c语言代码: #include<stdio.h> int main() { > ) { ; } printf("i = %d ...

  3. 【python】类的继承和多态

    比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印: class Animal(object): def run(self): print 'Animal is r ...

  4. python中使用多继承

    python中使用多继承,会涉及到查找顺序(MRO).重复调用(钻石继承,也叫菱形继承问题)等 MRO MRO即method resolution order,用于判断子类调用的属性来自于哪个父类.在 ...

  5. 深入super,看Python如何解决钻石继承难题

    1.   Python的继承以及调用父类成员 python子类调用父类成员有2种方法,分别是普通方法和super方法 假设Base是基类 class Base(object): def __init_ ...

  6. Python中类的__init__继承

    Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...

  7. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  8. python语法基础-初始化/继承

    写了一些程序,基本上都是直接def函数 然后在main方法中 调用 但是在一些应用程序中 会有基本语法的使用(初始化,继承) 初始化: 1.在程序执行时一定执行一次的操作 2.python中初始化in ...

  9. Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)

    Python 在子类中调用父类方法详解(单继承.多层继承.多重继承)   by:授客 QQ:1033553122   测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...

  10. day25 python学习 继承,钻石继承 多态

    ---恢复内容开始--- 通过一个列子认识父类和子类中,子类的如何实现对父类默认属性调用,同时拥有自己的属性,如何在子类中调用父类的方法,class Ainmal: country='afdas' d ...

随机推荐

  1. JAVA 操作mysql 存储 调用

    HashMap map = new HashMap(); map.put("a", 9); map.put("b", ""); List&l ...

  2. apache伪静态规则解析

    apache伪静态规则解析 最近有个客户有个要求,昨天折腾了一会,没解决,今天没啥就多学习学习 还是根据例子来学习比较快 1 简单的重定向规则 RewriteEngine On //启动规则 Rewr ...

  3. python学习笔记_week22

    note 知识点概要 - Session - CSRF - Model操作 - Form验证(ModelForm) - 中间件 - 缓存 - 信号 内容详细: 1. Session 基于Cookie做 ...

  4. iOS基础知识之多态问题

    多态是基于继承而言的,例如自定义父类Person,子类Son,那么可能会出现如下情况: Person *p =[ [Son alloc]init]; 这种情况时,便是多态的使用.多态属于动态创建对象, ...

  5. pycharm中查找替换妙用

    1.二行空格变一行(转载https://www.cnblogs.com/dreamfine/p/7760575.html) 网上COPY的代码,经常多出一个空行,不用一行行删除了,用替换功能吧,查找 ...

  6. JS call和apply方法使用

    总是对call和apply方法使用存在迷惑,特此记录一下 一句话理解这两个方法: call和apply是为了动态改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call ...

  7. JEECG前后端分离UI框架实战版本抢先体验(ng2-admin+Angular4+AdminLTE+WebStorm)

    JEECG前后端分离UI框架实战版本 - 抢先体验 (ng2-admin+Angular4+AdminLTE) 关键词: ng2-admin.Angular4.AdminLTE.Nodejs.Jeec ...

  8. JEECG 新手常见问题大全,入门必读

    大家还有什么问题,请跟帖,谢谢支持..  JEECG常见问题大全 原文地址:http://t.cn/RvYsEF61. jeecg数据库脚本问题   注意:jeecg3.5.2之前版本,不需要数据库脚 ...

  9. DirectX10安装路径自动生成DXSDK_DIR

    DXSDK_DIR C:\Program Files (x86)\Microsoft DirectX SDK (February 2010)\

  10. Leetcode 题解 Jump Game

    一,笨方法  o(n^2).果然看完别人的解法就自惭形秽啊!! 我用的动态规划方法. 比如输入 i: 0 1 2 3 4 ———————————————— a[i]: 2 3 1 0 4 直接利用原来 ...