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中如果没有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方法
综上所述
如果一个方法在多个子类中用到,那么就定义在父类的方法中,否则就定义在子类中