一、什么是单继承
单继承
,就是一个子类只继承一个父类
下面定义了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
中如果没有name
、age
那么也就意味着不能直接创建Animal
类的实例对象,否则当通过Animal
的实例对象调用info
方法时就会出现找不到name
、age
属性的问题
再来看下面的写法
写到子类
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
类中没有定义name
、age
属性就不能通过子类的对象调用info
方法;如果是采用第二种即上图右侧部显示的那种,好处是info
方法只会在Dog
类创建的实例对象中,即便定义了其它的子类继承Animal
,也不会导致这些新的子类额外的添加了info
方法
综上所述
如果一个方法在多个子类中用到,那么就定义在父类的方法中,否则就定义在子类中