初步理解Python面向对象继承

120 阅读3分钟

启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第34天,点击查看活动详情

了解过面向对象的小伙伴,对面向对象的三大特征都不陌生,封装,继承,多态,其中继承是最基础也是最常被使用的一个,Python作为一门面向对象的语言,自然是有继承的概念的,那么我们来看一下。

面向对象

面向对象是一种编程的思想,直接通过代码理解就是把一个业务实体的所有参数和功能用一个类来编写,之后使用的时候通过实例化这个类来使用,比如:编写一个做饭的功能,使用面向对象会先编写一个能做饭的实体,厨师或者厨房(这个要根据需求去定义,我们这里假定为厨师),然后基于厨师的概念,编写关于做饭的参数和功能,比如做饭的效率,可以做的饭,需要的材料,做饭的步骤等等,在使用的时候,先申明一个厨师,然后调用厨师做饭的功能。代码如下:

class Chef:
    """
    定义一个叫做厨师的类
    """
    cooking = 80 #厨艺值
    cuisine = "川菜" #菜系
    def get_materials(self):
        """
        获取食材的方法
        """
    def cook(self,materials):
        """
        进行烹饪
        """

继承

了解了上面的概念,我们再聊聊继承概念,基于上面的代码可以实现面向对象的基本代码,但是实际开发当中有这种可能,就是两个类有前后承接的关系,还是以厨师为例:加入初始可以分为面点,凉菜两种(只是举例,不专业哈),四种职业的厨师都需要基本的厨艺技能,但是每种又有自己独特的地方,最直接的写法:

class ColdChef:
    """
    凉菜师傅的类
    """
    cooking = 80 #厨艺值
    cuisine = "川菜" #菜系
    
    def skill_in_cutting(self):
        """
        切菜技巧
        """
        
    def cold_in_cutting(self):
        """
        凉菜技巧
        """class BakerChef:
    """
    面点师傅的类
    """
    cooking = 80 #厨艺值
    cuisine = "川菜" #菜系
    
    def skill_in_cutting(self):
        """
        切菜技巧
        """
        
    def cold_in_cutting(self):
        """
        面点技巧
        """
​
                

但是很显然这种写法冗余代码很多,冗余代码自然会带来代码一致性和可维护性的问题,所以,就有了继承的逻辑,Python的类默认都继承object类(默认不写),object是Python所有类的父类(也叫做基类),在这个基础上,开发者可以指定自己的继承关系,代码如下:

class Chef(object):
    """
    所有厨师的父类,默认继承object
    """
    cooking = 80 #厨艺值
    cuisine = "川菜" #菜系
    
    def skill_in_cutting(self):
        """
        厨师的共性技能,切菜
        """
        
class ColdChef(Chef):
    """
    凉菜师傅的类,继承厨师的类
    """
        
    def cold_in_cutting(self):
        """
        凉菜技巧
        """class BakerChef(Chef):
    """
    面点师傅的类,继承厨师的类
    """
        
    def cold_in_cutting(self):
        """
        面点技巧
        """

这里先定义了一个厨师共性技能的类,然后基于这个类进行继承,继承之后各个类型的厨师编写自己独有的技能。那么这个就是继承的基本使用方法。

但是这里要注意的是,继承的类如果有被继承类同名的方法,这个方法会被覆盖掉,比如,厨师类本身有厨艺这个属性默认值是80,这个时候名厨继承厨师类,厨艺值默认是160,只需要从新定义一个同名的属性就可以了,这也叫做重写:

class Chef(object):
    """
    所有厨师的父类,默认继承object
    """
    cooking = 80 #厨艺值
    cuisine = "川菜" #菜系
    
    def skill_in_cutting(self):
        """
        厨师的共性技能,切菜
        """
        
class FamousChef(Chef):
    """
    凉菜师傅的类,继承厨师的类
    """
    cooking = 160 #厨艺值    
    

关于Python面向对象的继承就先聊这么多,关于多类继承,钻石继承等技巧之后再一一讲解,还请各位大佬多多指点。