面向对象:继承与派生

Posted py-xiaoqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象:继承与派生相关的知识,希望对你有一定的参考价值。

7.4 继承:减少类之间的冗余

  • 什么是继承? + 继承指的是类与类之间的关系,是一种什么“是”什么的关系

  • 继承的作用:
    • 解决代码重用问题

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可以称为基类或超类,新建的类称为派生类或子类。

  • 对象的属性查找:
    • 对象中找>类中找>父类找>父类的父类...>最上级父类>报错

类继承例:

class Parentclass1:
    pass
    
class Parentclass2:
    pass
    
class Subclass1(Parentclass1):  # 继承一个类
    pass
    
class Subclass2(Parentclass1,Parentclass2):  # 继承多个类
    pass
    

# 查看继承关系

print(Subclass1.__bases__)  # (<class '__main__.Parentclass1'>,)
print(Subclass2.__bases__)  # (<class '__main__.Parentclass1'>, <class '__main__.Parentclass2'>)

把子类们都具有的共同的属性和方法,统一写在父类之中,以达到减少重复写同样代码

继承实例:

class Hero:
    def __init__(self, nickname, hp, atk):
        self.Nickname = nickname
        self.Hp = hp
        self.Atk = atk
    def attack(self, enemy):
        enemy.Hp -= self.Atk

class Gairun(Hero):
    pass

class Reven(Hero):
    pass

h1 = Gairun('a', 100, 10)
h2 = Reven('b', 70, 30)

print(h1.__dict__)
print(h2.__dict__)

h2.attack(h1)

print(h1.Hp)

属性查找例:

class Foo:
    def f1(self):
        print('from Foo.f1')
        
    def f2(self):
        print('from Foo.f2')     
        self.f1()  # 这里self 是调用他的对象,b调用了他,所以self是b

class Bar(Foo):
    def f1(self):
        print('from Bar.f1')

b = Bar()

b.f1()  # Bar类中有f1,所以调用Bar的f1
b.f2()  # Bar类中没有f2,所以调用父类中的f2。父类f2中的f1的self是b,所以就是b.f1()

执行结果:

from Bar.f1
from Foo.f2
from Bar.f1

7.5 派生

在子类中加入子类特有的属性和方法,就是派生

这里对派生属性的性查找顺序依然是:对象>类>父类...>最上级父类>报错

class Hero:
    def __init__(self, nickname, hp, atk):
        self.Nickname = nickname
        self.Hp = hp
        self.Atk = atk
    def attack(self, enemy):
        enemy.Hp -= self.Atk

class Gairun(Hero):
    camp = 'Demacia'  # 子类派生出的新数据属性
    
    def attack(self, enemy):  # 派生出的方法属性,并且这个属性覆盖了父类
        print('from Geren Class')
    
    def skill(self, enemy):  # 派生出的方法
        enemy.Hp -= (self.Atk * 2)

class Reven(Hero):
    camp = 'Noxus'  
    pass

h1 = Gairun('a', 100, 10)
h2 = Reven('b', 70, 30)

print(h1.__dict__)
print(h2.__dict__)

h1.attack(h2)  # 调用了同名的派生的方法
h1.skill(h2)  # 调用了派生的方法

print(h2.Hp)

以上是关于面向对象:继承与派生的主要内容,如果未能解决你的问题,请参考以下文章

06_继承与派生

python开发-面向对象的继承与派生

面向对象:继承与派生

python之旅:面向对象之继承与派生

Python3 面向对象-类的继承与派生

面向对象-继承与派生