在子类中重用父类的方法或属性

在子类派生出新发方式中重用父类的方法,有两种实现方式1.指名道姓(不依赖继承)# class Hero:#     def __init__(self,nickname,life_value,aggresivity):#         self.nickname=nickname#         self.life_value=life_value#         self.aggresivity=aggresivity#     def attack(self,enemy):#         enemy.life_value-=self.aggresivity## class Garen(Hero):#     camp=‘demacia‘#     def __init__(self,nickname,life_value,aggresivity,weapon):#         Hero.__init__(self,nickname,life_value,aggresivity)#         self.weapon=weapon##     def attack(self,enemy):#         Hero.attack(self,enemy)    #1,指名道姓#         print(‘from Garen class‘)## class Riven(Hero):#     camp=‘NOXUS‘### g=Garen(‘草丛伦‘,100,30,‘金箍棒‘)# r=Riven(‘锐雯雯‘,80,35)# print(g.__dict__)# print(r.life_value)# g.attack(r)# print(r.life_value)

‘‘‘# 2.super() (依赖继承)class Hero:    def __init__(self,nickname,life_value,aggresivity):        self.nickname=nickname        self.life_value=life_value        self.aggresivity=aggresivity    def attack(self,enemy):        enemy.life_value-=self.aggresivity

class Garen(Hero):    camp=‘demacia‘    def attack(self,enemy):        super(Garen,self).attack(enemy)#依赖继承        print(‘from Garen class‘)

class Riven(Hero):    camp=‘Noxus‘g=Garen(‘草丛伦‘,100,30)r=Riven(‘锐雯雯‘,80,35)g.attack(r)print(r.life_value)‘‘‘

‘‘‘class Hero:    def __init__(self,nickname,life_value,aggresivity):        self.nickname=nickname        self.life_value=life_value        self.aggresivity=aggresivity    def attack(self,enemy):        enemy.life_value-=self.aggresivity

class Garen(Hero):    camp=‘demacia‘    def __init__(self,nickname,life_value,aggresivity,weapon):        # self.nickname = nickname        # self.life_value = life_value        # self.aggresivity = aggresivity        # self.weapon = weapon       # Hero.__init__(self,nickname,life_value,aggresivity)        #super(Garen,self).__init__(nickname,life_value,aggresivity)  #依赖继承
        super().__init__(nickname,life_value,aggresivity)          #依赖继承(Python3)        self.weapon=weapon

def attack(self,enemy):        Hero.attack(self,enemy)    #指名道姓重用        print(‘from Garen class‘)

class Riven(Hero):    camp=‘NOXUS‘

g=Garen(‘草丛伦‘,100,30,‘金箍棒‘)r=Riven(‘锐雯雯‘,80,35)print(g.__dict__)print(r.life_value)g.attack(r)print(r.life_value)‘‘‘那么super是怎么实现在父类中查找的呢一个小验证方法:  

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‘>]  #C.mro() c的查找顺序,新式类(python3特有)

from A

from B

以上看出父类重用,是子类以mro()的顺序查找的,不论父类之间有没有继承关系
PS mro()‘老子才不管你老子是谁,老子只按老子的查找顺序查找‘
 

原文地址:https://www.cnblogs.com/sunny666/p/9641022.html

时间: 2024-10-11 01:04:24

在子类中重用父类的方法或属性的相关文章

Python之面向对象的组合、多态、菱形问题、子类中重用父类的两种方式

一.组合 ''' 1.什么是组合 组合就是一个类的对象具备某一个属性,该属性的值是指向另外一个类的对象 2.为何用组合 组合也是用来解决类与类直接代码冗余问题的 3.如何用组合 ''' # 继承减少代码冗余,但是将类与类进行了强耦合,python不崇尚,所以能不用继承就尽量不用继承 class OldboyPeople: school = 'oldboy' def __init__(self, name, age, sex): self.name = name self.age = age se

继承实现的原理、子类中调用父类的方法、封装

一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--->A--->E--->B--->C. class E: def test(self): print('from E') class A(E): def test(self): print('from A') class B: def test(self): print('from B'

Day17:继承实现的原理、子类中调用父类的方法、封装

一.继承实现的原来 1.继承顺序 Python的类可以继承多个类.继承多个类的时候,其属性的寻找的方法有两种,分别是深度优先和广度优先. 如下的结构,新式类和经典类的属性查找顺序都一致.顺序为D--->A--->E--->B--->C. class E: def test(self): print('from E') class A(E): def test(self): print('from A') class B: def test(self): print('from B'

在子类中重用父类的属性

在子类中派生出新的方法重用父类的方法,有两种实现方式 方式一:指名道姓(不依赖继承) class Hero: def __init__(self,name,damage,zing): self.name = name self.damage = damage self.zing = zing def attack(self,enemy): enemy.zing -= self.damage class Yang(Hero): def attack(self,enemy): Hero.attack

在子类中显示父类的方法

用super 1 package ppt04; package ppt04; public class Ostrich extends Bird { // 重写Bird类的fly()方法 public void fly() { System.out.println("我只能在地上奔跑..."); } public void callOverridedMethod() { // 在子类方法中通过super来显式调用父类被覆盖的方法. super.fly(); } public stati

在子类中重载父类的方法(重写方法)

<?php class person{ protected $name; protected $sex; protected $age; function __construct($name,$sex,$age){ $this->name=$name; $this->sex=$sex; $this->age=$age; } function say(){ echo "我的名字:".$this->name.":性别:".$this->

c++与java中子类中调用父类成员的方法

1 java中: 2 import java.util.Scanner; 3 public class ClassTest{ 4 public static void main(String args[]){ 5 child ch=new child(2); 6 parent p=ch; 7 p.print(); 8 //p.print2();//调用错误,父类中没有改成员方法,该方法只属于子类! 9 } 10 } 11 12 class parent{ 13 int xx; 14 parent

js中的子类继承父类的方法和属性

上次讲了个简单的继承,这次 咱们讲个稍微复杂点的,那就是让子类继承父类的属性和方法,假设人 (Person)是父类,工人(Worker)是子类,让worker继承person的属性和方法: 父类: function Person(name,age) { this.name=name; this.age=age; } Person.prototype.showName=function() { alert(this.name); } function worker(name,age,job) {

【Cocos2D-X 学习笔记】Node父类的方法和属性

Node方法: 1.创建节点 Node *childNode=Node::create(); 该方法多为Node的子类调用create()静态方法进行创建实例 2.增加新的子节点:node->addChild(childNode,1,Tag); //1是指Z轴的索引,简单讲表示层号,这里addChild并不是个静态方法,因此需要进行指针调用,另外根据多态性(函数重载),其形参还可以是 addChild(childNode,int zOrder)  或者addChild(childNode); 3