Python面向对象子类中重用父类的属性
一、指名道姓的方式,不依赖于继承
示例代码如下:
class Hero:def __init__(self, nick_name, life_value, aggresivity):self.nick_name = nick_nameself.life_value = life_valueself .aggresivity = aggresivitydef attack(self, enemy):enemy.life_value -= self.aggresivityclass Garen(Hero):camp = 'Demacia'def attack(self, enemy):Hero.attack(self, enemy)print('from Garen class')class Riven(Hero):camp = 'Noxus'g1 = Garen('草丛伦', 100, 30)
r1 = Riven('锐雯雯', 80, 50)
g1.attack(r1)
print(r1.life_value)结果为:from Garen class
50
从以上结果可以看出,即执行了自己的特有方法,又执行了父类中继承的方法
想为草丛伦增加一个weapon私有属性,代码如下:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Hero:def __init__(self, nick_name, life_value, aggresivity):self.nick_name = nick_nameself.life_value = life_valueself .aggresivity = aggresivitydef attack(self, enemy):enemy.life_value -= self.aggresivityclass Garen(Hero):camp = 'Demacia'def __init__(self, nick_name, life_value, aggresivity, weapon):self.nick_name = nick_nameself.life_value = life_valueself.aggresivity = aggresivityself.weapon = weapondef attack(self, enemy):Hero.attack(self, enemy)print('from Garen class')class Riven(Hero):camp = 'Noxus'g1 = Garen('草丛伦', 100, 30)
r1 = Riven('锐雯雯', 80, 50)
g1.attack(r1)
print(r1.life_value)结果报错:Traceback (most recent call last):File "C:/Users/xu516/PycharmProjects/Python全栈开发/第三模块/面向对象编程/12 在子类中重用父类的属性.py", line 31, in <module>g1 = Garen('草丛伦', 100, 30)
TypeError: __init__() missing 1 required positional argument: 'weapon'
报错提示缺少一个weapon位置参数,加上位置参数就可以实例化成功了,
但是发现了重复代码,怎样减少重复代码呢,可以使用
Hero.__init__(self, nick_name, life_value, aggresivity)
二、super()方法,依赖继承
super(Garen, self).attack(enemy)super().__init__(nick_name, life_value, aggresivity)
三、super也会按照mro顺序区查找属性,
示例代码如下:
class A:def f1(self):print('from A')super().f1()class B:def f1(self):print('from B')class C(A,B):passprint(C.mro())c = C()
c.f1()结果为:[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
from A
from B
可以看出,super并没有去找父类,而是安装mro顺序查找
Python面向对象子类中重用父类的属性相关推荐
- Python 在子类中调用父类方法详解(单继承、多层继承、多重继承)
Python 在子类中调用父类方法详解(单继承.多层继承.多重继承) by:授客 QQ:1033553122 测试环境: win7 64位 Python版本:Python 3.3.5 代码实践 ...
- Python在子类中调用父类方法
1.在子类中调用父类方法 super().方法名() 类名.方法名(self) spuer(要从哪一个类的上一级类开始查找, self).方法名() 子类调用父类方法时,一般都是想对父类方法进行扩展 ...
- python在子类中添加新的属性_pycharm实现在子类中添加一个父类没有的属性
我就废话不多说了,还是直接看代码吧! class Car(): """一次模拟汽车的简单尝试""" def __init__(self, m ...
- python在子类中添加新的属性_python - 如何创建类属性?
python - 如何创建类属性? 在python中,我可以使用@classmethod装饰器向类添加方法. 是否有类似的装饰器向类中添加属性? 我可以更好地展示我在说什么. class Exampl ...
- Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表
Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表 <?xml version="1.0"?> <!DOCTYPE hibernate-m ...
- php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性
我有以下两个班级. BMW级延伸级轿车. class Car{ public $doors; public $wheels; public $color; public $size; public f ...
- 继承实现的原理、子类中调用父类的方法、封装
一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--- ...
- Day19:继承实现的原理、子类中调用父类的方法、封装
一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--- ...
- 在子类中调用父类的方法super
1.没有super之前,在子类里面需要父类里面的逻辑,但是我们是通过派生(自己定义了一个init,增加了一条line) class vehichle:#定义一个交通工具的类Country=" ...
最新文章
- unzip 压缩包含路径,解压缩覆盖路径下的同名文件
- 你可能不知道的Shell
- linux out of memory分析(OOM)
- INNODB的锁的类型
- C++ 高级数据类型(六)—— 自定义数据类型
- GC算法 垃圾收集器
- 真实赛车3,SPEEDRUSH TV 第3季,第3阶段(第3天),直线加速赛
- 百度10.55亿元入股创维酷开,李彦宏要为电视带来AI遥控器
- 与Flutter第一次亲密接触-Android 视角
- Word2003和2007如何隐藏去掉回车符
- 字节码指令之算术指令
- 排错解决:etcd节点掉线后(code=exited, status=1/FAILURE),如何加入
- 设计模式之Builder模式
- 微信小程序地图与位置相关操作
- html圆形头像的制作
- TinyMCE自定义表情包
- js简单实现根据身份证号码识别性别年龄生日
- hbuilderx升级3.6.5版本后运行到手机端同步资源失败,未得到同步资源的授权,请停止运行后重新运行,并注意手机上的授权提示
- 教学教法改革效果评估的4种方法
- YUV420P视频裁剪
热门文章
- 多线程编写12306售票系统
- 巧用Excel笔画排序,实现计算汉字笔画数
- 格调高又小众的EPUB 阅读器(转载)
- 下载安装eiigui工具
- XYOj2113:找点(区间选点问题)
- i.MX RT1064-EVK开发板中基于LPC4322JET100的Freelink调试电路简介
- 蓝牙成为物联网市场中的有力竞争者
- 阿里云短信类最新版dysmsapi.aliyuncs.com
- 为什么计算机集群叫云,为什么叫云计算?
- 论文笔记 Weakly Supervised Deep Detection Networks - CVPR 2016