zoukankan      html  css  js  c++  java
  • 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中的TfidfVectorizer参数解析
    Newsgroups数据集介绍
    鸢尾花数据读取的总结
    Knapsack Problems
    3.1.6 Stamps
    3.1.5 Contact
    3.1.4 Shaping Regions
    3.1.3 Humble Numbers
    3.1.2 Score Inflation
  • 原文地址:https://www.cnblogs.com/dong4716138/p/15743855.html
Copyright © 2011-2022 走看看