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'>]
  • 相关阅读:
    未来的计划和考虑
    jquery 常用的方法
    对于页面动态加载的元素事件无效的解决方案
    Myeclipse8.5中svn插件安装方法总结
    JS读RSS
    JAVA的RSS处理
    环境:win7+ie8 IE8的F12不起作用,原因如下:
    关闭和释放JDBC
    关于Eclipse无法生成class文件的问题
    JavaScript跨域总结与解决办法
  • 原文地址:https://www.cnblogs.com/nanjo4373977/p/12176028.html
Copyright © 2011-2022 走看看