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方法

综上所述

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

原文地址:https://www.cnblogs.com/dong4716138/p/15743855.html