继承是什么
如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。
继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。
在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
另外,为子类别追加新的属性和方法也是常见的做法。
继承的特性
类的结构
代码理解
class Animal:
def eat(self):
print('吃!!!')
def drink(self):
print('喝!!!')
def run(self):
print('跑!!!')
def sleep(self):
print('睡!!!')
class Cat(Animal):
# def eat(self):
# print('吃!!!')
# def drink(self):
# print('喝!!!')
# def run(self):
# print('跑!!!')
# def sleep(self):
# print('睡!!!')
def call(self):
print('喵喵!!')
class Hellokitty(Cat):
def speak(self):
print('我可以说话')
def call(self):
# 调用原本在父类中封装的方法
super().call()--->保留父类的方法,进行改写。不加此句,子类中与父类同名的方法会覆盖父类的方法。
# Cat.call(self) python2.x
# 针对子类特有的需求 编写代码
print('#%@@#$#@%')
class Dog(Animal):
pass
cat = Hellokitty()
cat.eat()
cat.drink()
cat.run()
cat.call()
dog = Dog()
dog.run()
dog.eat()
Animal类是父类,它的方法可以被子类Cat调用,子类Cat也可以有自己的私有方法。
HelloKitty类继承自Cat类,它的父类是Cat继承。继承具有传递性。
理解方法的覆盖
class A:
def test(self):
print('A----test方法')
def demo(self):
print('A----demo方法')
class B:
def test(self):
print('B----test方法')
def demo(self):
print('B----demo方法')
class C(B,A): #B会覆盖A
#若A写在前面 A会覆盖B
pass
c = C()
c.test()
c.demo()
运行结果:
super关键字
class Bird(object):
def __init__(self):
self.hungry = True
def eat(self):
if self.hungry:
print('$$@#%@%')
self.hungry = False
else:
print('No thanks')
class SongBird(Bird):
def __init__(self):
# super().__init__()
self.sound = 'aaaaaa'
def sing(self):
print(self.sound)
bird = SongBird()
bird.eat()
bird.sing()
上述代码执行时会报错。
原因:
子类和父类有同名函数__init__,子类会覆盖父类的方法。
因此子类中没有hungry属性。
当在子类方法名前加上super().__init__()
,就不会报错。