Python基础之类的继承

这篇博客探讨了Python面向对象的三大特征——封装、继承和多态。重点介绍了继承的概念,包括如何定义子类并继承父类的特征和行为,如照搬、重写和添加。还讨论了多继承的优势,以及`super()`函数在多继承中的MRO算法。此外,文章提到了枚举类的使用,帮助开发者定义和识别常量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python基础之类的继承

面向对象的特征是封装、继承、多态
封装便是将代码封装在类内部,实现代码规范及代码重用
多态指同一个方法,不同对象在调用时执行的结果不同
而继承则是三者中最重要的一部分,一种语言不支持继承,类就没有什么意义


##1.继承的语法
继承的语法格式
class 子类(父类)
定义一个子类,继承自某一个指定的父类。子类在继承父类时,会将父类所有的特征和行为全部继承

# 人类
class Person:
    def __init__(self,**kw):
        self.__name = kw['name']
        self.__sex = kw['sex']
        self.__age = kw['age']
        self.__height = kw['height']
        self.__weight = kw['weight']

    @property
    def name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    @property
    def sex(self):
        return self.__sex

    @property
    def height(self):
        return self.__height

    @property
    def weight(self):
        return self.__weight

    def introduce(self):
        print("我叫%s,今年%d岁,性别%s,身高%d,体重%.1fkg" % (self.__name, self.__age, self.__sex, self.__height, self.__weight))
    def talk(self):
        print("我们当前正在交谈")
        
# 学生类
class Student(Person):
    def __init__(self, **kw):
        Person.__init__(self, **kw)
        self.__sno = kw['sno']
        self.__classroom = kw['classroom']
        self.__major = kw['major']
        self.__school = kw['school']

# 创建学生对象
stu = Student(name="WXQ", age=23, sex="男", height=173, weight=65, sno="150906102", classroom="挖掘机一班", major="挖掘机", school="蓝翔")
stu.introduce()
# 我叫WXQ,今年23岁,性别男,身高173,体重65.0kg

子类从父类继承过来的所有行为主要有三种:
(1)照搬:直接通过子类对象调用从父类继承的方法
(2)重写(方法重载):重新定义从父类继承的方法的实现,此过程可以实现面向对象的多态操作。多态:同一个方法,不同对象在调用时执行的结果不同,此过程称为多态
(3)添加:从父类继承的方法在调用时先通过父类调用该方法,之后再添加子类的具体操作

# 人类
class Person:
    def __init__(self,**kw):
        self.__name = kw['name']
        self.__sex = kw['sex']
        self.__age = kw['age']
        self.__height = kw['height']
        self.__weight = kw['weight']

    @property
    def name(self):
        return self.__name

    @property
    def age(self):
        return self.__age

    @property
    def sex(self):
        return self.__sex

    @property
    def height(self):
        return self.__height

    @property
    def weight(self):
        return self.__weight

    def introduce(self):
        print("我叫%s,今年%d岁,性别%s,身高%d,体重%.1fkg" % (self.__name, self.__age, self.__sex, self.__height, self.__weight))
    def talk(self):
        print("我们当前正在交谈")
# 学生类
class Student(Person):
    def __init__(self, **kw):
        Person.__init__(self, **kw)
        self.__sno = kw['sno']
        self.__classroom = kw['classroom']
        self.__major = kw['major']
        self.__school = kw['school']

    # 重写
    def introduce(self):
        print("我叫%s,今年%d岁,性别%s,身高%d,体重%.1fkg,就读于%s %s专业 %s,学号%s" % (self.name, self.age, self.sex, self.height, self.weight, self.__school, self.__major, self.__classroom, self.__sno))

    # # 添加(在原函数基础上重新添加一部分新功能)
    # def introduce(self):
    #     Person.introduce(self)
    #     print("就读于%s %s专业 %s,学号%s" % (self.__school, self.__major, self.__classroom,  self.__sno))


# 创建学生对象
stu = Student(name="WXQ", age=23, sex="男", height=173, weight=65, sno="150906102", classroom="挖掘机一班", major="挖掘机", school="蓝翔")
stu.introduce()
# 我叫WXQ,今年23岁,性别男,身高173,体重65.0kg  照搬结果
# 我叫WXQ,今年23岁,性别男,身高173,体重65.0kg,就读于蓝翔 挖掘机专业 挖掘机一班,学号150906102  重写结果
# 我叫WXQ,今年23岁,性别男,身高173,体重65.0kg
# 就读于蓝翔 挖掘机专业 挖掘机一班,学号150906102 添加结果

##2.多继承
多继承:子类可以同时拥有多个父类的现象称为多继承

多继承的优点:子类可以通过多继承的操作,获得比较丰富的属性和功能,同时多继承可以将父类中的代码进行分解,方便进行代码的维护

# 类如果继承object类称为新式类,没有继承object类称为经典类,开发中一般使用经典类
class Tool(object):
    def __init__(self, **kwargs):
        self.__name = kwargs['name']
        self.__weight = kwargs['weight']
        self.__speed = kwargs['speed']

    @property
    def name(self):
        return self.__name

class Ship(Tool):
    def __init__(self, **kwargs):
        # Tool.__init__(self, **kwargs)
        super().__init__(**kwargs)
        self.__waterP = kwargs['waterP']
        self.__waterE = kwargs['waterE']

    def float_move(self):
        print("轮船%s正在水上航行" % self.name)

    def move_wz(self):
        print("%s当前正在执行转移物资任务" % self.name)

class Plane(Tool):
    def __init__(self, **kwargs):
        # Tool.__init__(self, **kwargs)
        super().__init__(**kwargs)
        self.__flyH = kwargs['flyH']
        self.__company = kwargs['company']

    def fly_move(self):
        print("飞机%s正在执行飞行任务" % self.name)

class WaterPlane(Ship, Plane):
    def __init__(self, **kwargs):
        super(Plane, self).__init__(**kwargs)
        # Ship.__init__(self, **kwargs)
        # Plane.__init__(self, **kwargs)
        self.__power = kwargs['power']

# 创建水上飞机对象
wp = WaterPlane(name="蜡笔大新", weight="150吨", speed="60km/h", waterP="100000吨", waterE="10m", flyH="50m", company="大力神", power="5000kw")
wp.fly_move()
wp.float_move()
wp.move_wz()
# 飞机蜡笔大新正在执行飞行任务
# 轮船蜡笔大新正在水上航行
# 蜡笔大新当前正在执行转移物资任务

super():python内置的函数,主要应用于继承操作。
作用:获取当前所在类的对象;调用该对象,分别执行其父类的执行算法

super()在执行父级元素筛选时应遵循MRO算法(深度优先算法),在多继承中首先查找到该类最左边的父类,其次再查找该父类的父类,知道该父类的基类。接着再查找下一个父类,查找原则同上,直到找到所有父类。注意如果查找过程中有多个类型重复,则以最后查到的为准


##3. 枚举类
枚举类:定义一个类继承自Enum类,此时定义的类即为枚举类
枚举类可以版主开发人员定义对应的常量,为每一个常量设置一个易于理解的名字,方便开发人员识别
@unique用来装饰枚举类,避免枚举类中出现值的重复

from enum import Enum, unique

@unique
class Week(Enum):
    Sunday = 7
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Satusday = 6

def outPut(week):
    if week == Week.Sunday:
        print("周日")
    elif week == Week.Monday:
        print("周一")
    elif week == Week.Tuesday:
        print("周二")
    elif week == Week.Wednesday:
        print("周三")
    elif week == Week.Thursday:
        print("周四")
    elif week == Week.Friday:
        print("周五")
    elif week == Week.Satusday:
        print("周六")

outPut(Week.Satusday)
# 周六


##4.例题

#  定义一个分数类,分别完成分数的加减乘除
class Fra(object):
    def __init__(self, fz = 0, fm = 1):
        self.__fz = fz
        if fm == 0:
            raise ValueError("分数中分母不能为0")
        else:
            self.__fm = fm

    @property
    def fm(self):
        return self.__fm
    @fm.setter
    def fm(self, fm):
        if isinstance(fm, int) and fm != 0:
            self.__fm = fm
        else:
            raise ValueError("分母值错误")
    @property
    def fz(self):
        return self.__fz
    @fz.setter
    def fz(self, fz):
        if isinstance(fz,int):
            self.__fz = fz
        else:
            raise ValueError("分子类型错误")
    # 将分子和分母转换成分数格式
    def changeFormat(self):
        minValue = min(self.__fm, self.__fz)
        maxValue = max(self.__fm, self.__fz)
        while maxValue % minValue != 0:
            temp = maxValue % minValue
            maxValue = minValue
            minValue = temp
        self.__fz //= minValue
        self.__fm //= minValue
        if self.__fm == 1:
            str = "{fz}".format(fz=self.__fz)
        else:
            str = "{fz}/{fm}".format(fz=self.__fz, fm=self.__fm)
        return str

# 定义一个计算类,专门进行分数的加减乘除
class Calculate(object):

    def adjust(self, fc1, fc2, sign="+"):
        sign = sign.strip(" ")
        if sign == '+':
            fz = fc1.fz * fc2.fm + fc2.fz * fc1.fm
        elif sign == '-':
            fz = fc1.fz * fc2.fm - fc2.fz * fc1.fm
        elif sign == '*':
            fz = fc1.fz * fc2.fz
        elif sign == '/':
            fz = fc1.fz * fc2.fm
        else:
            raise ValueError("暂不支持")

        if sign == "/":
            fm = fc1.fm * fc2.fz
        else:
            fm = fc1.fm * fc2.fm

        fc = Fra(fz, fm)
        return fc.changeFormat()


f1 = Fra(3, 10)
f2 = Fra(7, 15)
cl = Calculate()
print(cl.adjust(f1, f2, '*'))
# 7/50
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值