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'>]
  • 相关阅读:
    约束constraint
    多表查询
    多表关系
    vue 页面跳转的两种方式
    Java三大特性
    如何搭建vue搭建手脚架(vue-cli 3.0以上版本)
    Mysql高版本不兼容group by解决方案
    springboot整合shiro 报 This application has no explicit mapping for /error, so you are seeing this as a fallback. 错误
    使用Springboot整合redis与mysql
    Springboot登录拦截器
  • 原文地址:https://www.cnblogs.com/nanjo4373977/p/12176028.html
Copyright © 2011-2022 走看看