• Python面向对象12.单继承


    一、什么是单继承

    单继承,就是一个子类只继承一个父类

    下面定义了2个类,Animal类是父类它编写了3个功能,Dog类是子类它继承了Animal的功能

    class Animal:
        def eat(self):
            print("吃饭...")
    
        def drink(self):
            print("喝水...")
    
        def sleep(self):
            print("睡觉...")
    
    
    class Dog(Animal):
        pass
    
    
    dog = Dog()
    dog.eat()
    dog.drink()
    dog.sleep()
    

      

     

    运行上述代码,会看到如下效果

    吃饭...
    喝水...
    睡觉...
    

      

     

    二、新方法写到哪里?父类?子类?

    假如现在需要在上述的代码中,添加一个新的方法info,那么该写到父类中还是子类中呢?

    写到父类

    class Animal:
        def eat(self):
            print("吃饭...")
    
        def drink(self):
            print("喝水...")
    
        def sleep(self):
            print("睡觉...")
    
        def info(self):
            print("名字是:" + self.name + ", 年龄是" + str(self.age))
    
    
    class Dog(Animal):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    
    dog = Dog("小黑", 2)
    dog.eat()
    dog.drink()
    dog.sleep()
    dog.info()
    

      

     

    运行效果如下:

    吃饭...
    喝水...
    睡觉...
    名字是:小黑, 年龄是2
    

      

     

    从上述的运行来看,虽然Animal类中没有name属性、age属性,但是可以在子类中添加这2个属性,只要方法被子类继承后,通过子类的对象调用时可以直接使用子类的属性

    但是,要注意如果在父类Animal中如果没有nameage那么也就意味着不能直接创建Animal类的实例对象,否则当通过Animal的实例对象调用info方法时就会出现找不到nameage属性的问题

    再来看下面的写法

    写到子类

    class Animal:
        def eat(self):
            print("吃饭...")
    
        def drink(self):
            print("喝水...")
    
        def sleep(self):
            print("睡觉...")
    
    
    class Dog(Animal):
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def info(self):
            print("名字是:" + self.name + ", 年龄是" + str(self.age))
    
    
    dog = Dog("小黑", 2)
    dog.eat()
    dog.drink()
    dog.sleep()
    dog.info()
    

      

     

    运行效果如下:

    吃饭...
    喝水...
    睡觉...
    名字是:小黑, 年龄是2
    

      

     

    为了更方便的对比出上述2种写法的不同,看下图

    可以看到,第2种写法仅仅是将方法info移动到类Dog中,那你可能要问了,即使这2种写法不同,但有什么区别吗?

    答:如果是采用第一种即上图左侧部分的那种,此时info方法是在父类Animal中,如果以后这个程序代码还有添加新的子类例如Cat类,那么Cat类中也会继承这个方法,那么如果子类Cat类中没有定义nameage属性就不能通过子类的对象调用info方法;如果是采用第二种即上图右侧部显示的那种,好处是info方法只会在Dog类创建的实例对象中,即便定义了其它的子类继承Animal,也不会导致这些新的子类额外的添加了info方法

    综上所述

    如果一个方法在多个子类中用到,那么就定义在父类的方法中,否则就定义在子类中

  • 相关阅读:
    python命令行工具模块-click
    python项目代码打包成Docker镜像
    背包九讲
    秒杀项目的3个奇数问题:并发队列的选择,请求接口的合理设计,高并发下的数据安全
    java类加载过程
    索引失效
    java面试
    进程间通信
    HashMap在Jdk1.7和1.8中的实现
    十大排序算法
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15743855.html
Copyright © 2020-2023  润新知