持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的17天,点击查看活动详情
👨🎓作者:Java学术趴
💌公众号:Java学术趴
🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。
🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。
☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!
👋大家好!我是你们的老朋友Java学术趴。今天给大家分享一下Python中的继承,大家可能都知道Java中存在继承,但是Java中的继承是单继承方式,而在Python中可以是单继承也可以是多继承的方式。
第十三章 继承
python和Java一样,也存在oop的三大特性:封装、继承、多态
对于面向对象的继承来说,其实就是将多个共有的方法提取到父类中,子类仅需继承父类而不必一一的实现每个方法
python继承和Java继承最大的区别就是:python支持多继承,而Java中不支持
13.1 单继承
# 继承。所有的类都默认继承object,继承语法:类名(继承父类的类名)
class Animal(object):
def __init__(self, name, age):
self.name = name
self.age = age
"""
此时Animal作为一个父类
定义一些公共的方法
"""
def eat(self):
print('吃饭')
pass
def sleep(self):
print('睡觉')
pass
pass
# 定义Animal的子类
class Dog(Animal):
# 该子类中特有的方法
def wanWangJiao(self):
print('小狗汪汪叫')
pass
pass
# 定义Animal的子类。小括号中的写的就是继承的父类名称
class Cat(Animal):
# 该子类中特有的方法
def miaoMiaoJiao(self):
print('小猫喵喵叫')
pass
pass
# 定义子类的实例对象
cat = Cat('小花', 3)
dog = Dog('小黑', 4)
# 调用父类中的方法
cat.eat()
# 吃饭
cat.sleep()
# 睡觉
dog.eat()
# 吃饭
dog.sleep()
# 睡觉
13.2 多继承
继承的传递性
多继承继承父类中的属性
# 多继承。所有的类都默认继承object,继承语法:类名(继承父类的类名, 继承父类的类名)
class Animal(object):
def __init__(self, name, age, type):
self.name = name
self.age = age
self.type = type
pass
def eat(self):
print('吃饭')
pass
class Zoom(object):
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def sleep(self):
print('睡觉')
pass
pass
# 定义一个子类同时继承Animal、Zoom
class Dog(Zoom, Animal):
def __init__(self, name, age, sex):
# 这里需要继承父类的类属性,也是继承实体类中的第一个实体类中参数
# 使用 super() 调用,可以不给定 self 参数,他会自己寻找父类
super().__init__(name, age, sex)
# 使用类名调用的形式,此时需要给定 self 参数
Animal.__init__(self, name, age, type)
# Zoom
# 此时的self代表的是:Dog这个实例类对象,它继承的参数是第一个类中的属性
# 所以它获取不到Animal类中的 type 属性,会报错
# 如果想获取type属性,需要把Animal类写到第一个位置
def __str__(self):
# return '小狗的名字叫做:{},小狗的年龄是:{},小狗的性别是:{},小狗的类型是:{}'.format(self.name, self.age, self.sex, self.type)
return '小狗的名字叫做:{},小狗的年龄是:{},小狗的性别是:{}'.format(self.name, self.age, self.sex)
# 该子类中特有的方法
def wanWangJiao(self):
print('小狗汪汪叫')
pass
pass
# 定义子类的实例对象
# 在多继承的情况下,需要看Dog()中继承的多个父类第一个是谁,其中的参数对应的是第一个继承父类中的参数个数和类型
dog = Dog('小黑', 3, '男')
print(dog)
# 小狗的名字叫做:小黑,小狗的年龄是:3,小狗的性别是:男
子类使用父类中的方法
# 多继承。所有的类都默认继承object,继承语法:类名(继承父类的类名, 继承父类的类名)
class Animal(object):
def eat(self):
print('吃饭')
pass
pass
class Zoom(object):
def sleep(self):
print('睡觉')
pass
pass
# 定义一个子类同时继承Animal、Zoom
class Dog(Zoom, Animal):
# 该子类中特有的方法
def wanWangJiao(self):
print('小狗汪汪叫')
pass
pass
dog = Dog()
# 使用父类中的方法
dog.eat()
# 吃饭
dog.sleep()
# 睡觉
# 使用自己特有的方法
dog.wanWangJiao()
# 小狗汪汪叫
多级父类调用以及方法覆盖
# 多继承。所有的类都默认继承object,继承语法:类名(继承父类的类名, 继承父类的类名)
class Animal(object):
def eat(self):
print('吃饭')
pass
class Zoom(Animal):
def sleep(self):
print('睡觉')
pass
# 子类覆盖重写了父类的eat()方法。必须存在继承才会出现方法的覆盖重写
def eat(self):
print('吃骨头')
pass
pass
class Dog(Zoom):
# 该子类中特有的方法
def wanWangJiao(self):
print('小狗汪汪叫')
pass
pass
dog = Dog()
# 使用父类中的方法
dog.sleep()
# Animal
# 可以看到Zoom、Animal类中都存在eat()方法
# 他会采用就近原则,先调用直接父类的方法,之后在向上一级进行寻找
dog.eat()
# 吃骨头
类的传递过程中,我们把父类又称为基类,子类称为派生类,父类的属性和方法可以一级一级的传递到子类
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖重写与父类中同名的方法
子类继承父亲的类属性并且添加自己额外的属性
# 多继承。所有的类都默认继承object,继承语法:类名(继承父类的类名, 继承父类的类名)
class Animal(object):
def __init__(self, name, age):
self.name = name
self.age = age
self.type = type
pass
def eat(self):
print('吃饭')
pass
# 定义一个子类同时继承Animal、Zoom
class Dog(Animal):
def __init__(self, name, age):
# 继承父类的类属性
Animal.__init__(self, name, age)
# 自定义子类的特有属性
self.type = '柯基'
def __str__(self):
return '小狗的名字叫做:{},小狗的年龄是:{},小狗的类别是:{}'.format(self.name, self.age, self.type)
# 该子类中特有的方法
def wanWangJiao(self):
print('小狗汪汪叫')
pass
pass
dog = Dog('小黑', 3)
print(dog)
# 小狗的名字叫做:小黑,小狗的年龄是:3,小狗的性别是:男