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

    一、指名道姓法(不依赖继承,直接通过类调用方法和属性)

    class Hero:
        def __init__(self, name, life, damage):
            self.name = name
            self.life = life
            self.damage = damage
    
        def attack(self, enemy):
            enemy.life -= self.damage
    
    
    class Garen(Hero):
        animal = 'Garen'
    
        def attack(self, enemy):
            Hero.attack(self, enemy)  # 指名道姓的方式
    
        def __init__(self, name, life, damage, tree):
            Hero.__init__(self, name, life, damage)
            self.tree = tree
    
    
    st1 = Garen('盖伦', 100, 40, '大保健')
    class Riven(Hero):
            pass
    
    
    st2 = Riven('锐雯', 100, 50)
    print(st2.life)
    st1.attack(st2)
    print(st2.life)
    
    
    输出结果:
    {'name': '盖伦', 'life': 100, 'damage': 40, 'tree': '大保健'}
    100
    60

    二、super()依赖继承

    class Hero:
        def __init__(self, name, life, damage):
            self.name = name
            self.life = life
            self.damage = damage
    
        def attack(self, enemy):
            enemy.life -= self.damage
    
    
    class Garen(Hero):
        animal = 'Garen'
    
        def attack(self, enemy):
            super(Garen, self).attack(enemy)   #固定格式super(对象名,self)
    
        def __init__(self, name, life, damage, web):
            super().__init__(name, life, damage)     #固定格式super()
            self.web = web
    
    
    st1 = Garen('盖伦', 100, 40, '大保健')
    print(st1.__dict__)
    
    
    class Riven(Hero):
        animal = 'Noxus'
    
    
    st2 = Riven('锐雯', 100, 50)
    print(st2.life)
    st1.attack(st2)
    print(st2.life)
    
    
    输出结果:
    {'name': '盖伦', 'life': 100, 'damage': 40, 'web': '大保健'}
    100
    60

    super找方法的顺序

    class A:
        def f1(self):
            print('from A')
            super().f1()
    
    
    class B:
        def f1(self):
            print('from B')
    
    
    class C(A, B):
        pass
    
    
    print(C.mro())
    
    a = C()
    a.f1()
    
    
    输出结果:
    [<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>]
    from A
    from B
    
    super是根据mro的顺序来找方法,先找A类,然后找到super时,在A顺序的基础上去找B的f1方法
  • 相关阅读:
    (转)使用Regex.Replace只替换字符串一次
    转:div超出范围显示省略号
    ibatis This SQL map does not contain a MappedStatement
    ibatis 多表关联
    ibatis 传入xml Hashtable的应用以及动态字段出错的解决方法
    前台学习过程
    转:C#动态循环生成button怎么分别写他们的事
    在oracle DB 中通过JOB 调用存储过程
    sybase与oracle存储过程的写法对比
    游标Oracle游标使用大全
  • 原文地址:https://www.cnblogs.com/huizaia/p/9665309.html
Copyright © 2011-2022 走看看