zoukankan      html  css  js  c++  java
  • 在子类中重用父类的属性

    在子类派生出的新的方法中重用父类的方法,有两种实现方式

    一、指名道姓(不依赖继承)

    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 Libai(Hero):
        camp = "Tangchao"
        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)  # 指名道姓,有几个参数就需要传几个参数
            print("from Libai Class")
    
    class Huamulan(Hero):
        camp = "Changcheng"
    
    l1 = Libai("进一步",100,60,"")

    二、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 Libai(Hero):
        camp = "Tangchao"
        def __init__(self,nickname,life_value,aggresivity,weapon):
            #Hero.__init__(self,nickname,life_value,aggresivity)
    
            #super(Libai,self).__init__(nickname,life_value,aggresivity)  # python2的写法
            super().__init__(nickname,life_value,aggresivity)  # python3的写法
            self.weapon = weapon
        def attack(self,enemy):
            super(Libai,self).attack(enemy)  # 依赖继承  super(Libai,self)是指对象,.attack是调用对象的方法
            print("from Libai Class")
    
    class Huamulan(Hero):
        camp = "Changcheng"
    
    l1 = Libai("进一步",100,60,"")

    这两种方式的区别是:方式一是跟继承没有关系的,而方式二的super()是依赖于继承的,并且即使没有直接继承关系,super仍然会按照mro继续往后查找

    #A没有继承B,但是A内super会基于C.mro()继续往后找
    class A:
        def test(self):
            super().test()
    class B:
        def test(self):
            print('from B')
    class C(A,B):
        pass
    
    c=C()
    c.test() #打印结果:from B
    
    
    print(C.mro())
    #[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
  • 相关阅读:
    *****Exercise 4.1 Generate a multiplication table
    Exercise 3.4 A calculator that allows multiple calculations
    Exercise 3.3 Calculate a discounted price
    Exercise 3.2 Display a date
    理解Java异常处理机制
    eclipse远程Debug配置
    [转]java代码性能优化总结
    [转]A星寻路算法
    JVM参数配置
    Gradle笔记(1) 安装
  • 原文地址:https://www.cnblogs.com/nanjo4373977/p/12176028.html
Copyright © 2011-2022 走看看