概念
继承是指一个对象直接使用另一对象的属性和方法。
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。
Python中类的继承分为:单继承(Single Inheritance)和多继承(Multiple Inheritance)。
class ParentClassOne: # 定义第一个父类
pass
class ParentClassTwo: # 定义第二个父类
pass
class SubClassOne(ParentClassOne): # 定义第一个子类继承一个父类
pass
class SubClassTwo(ParentClassOne, ParentClassTwo): # 定义第二个子类继承两个父类
pass
查看继承
__bases__:查看所有继承的父类。如
class ParentClassOne: # 定义第一个父类
pass
class ParentClassTwo: # 定义第二个父类
pass
class SubClassOne(ParentClassOne): # 定义第一个子类继承一个父类
pass
class SubClassTwo(ParentClassOne, ParentClassTwo): # 定义第二个子类继承两个父类
pass
print(ParentClassOne.__bases__)
print(SubClassOne.__bases__)
print(SubClassTwo.__bases__)
结果:
(<class 'object'>,)
(<class '__main__.ParentClassOne'>,)
(<class '__main__.ParentClassOne'>, <class '__main__.ParentClassTwo'>)Process finished with exit code 0
提示:如果没有提示基类,Python的类会默认继承object类,object是所有Python的基类,它能提供一些常见的方法(如__str__等)。
继承的重要性
例:如果有两个类,猫和狗:
猫会做:爬树,吃,喝,拉撒
狗会做:看家,吃,喝,拉撒
如果我们想要分别为猫和狗创建类,那么你可能会这样做:
class Cat:
def climb(self):
print("猫爬树")
def eat(self):
pass
def drink(self):
pass
def pee(self):
pass
class Dog:
def housekeeping(self):
print("狗看家")
def eat(self):
pass
def drink(self):
pass
def pee(self):
pass
从上述代码不难看出,吃,喝,拉,撒是猫和狗共有的功能,而我们却分别的为猫和狗创建两次,这样未免过于复杂。我们可以使用继承的思想来避免重写这些代码,利用这个思想,你可以这样思考:
动物:吃,喝,拉撒
猫:看家(继承动物所有的功能)
狗:看门(继承动物所有的功能)
那么我们可以这样操作:
class Animal:
def eat(self):
pass
def drink(self):
pass
def pee(self):
pass
class Cat(Animal):
def climb(self):
print("猫爬树")
class Dog(Animal):
def housekeeping(self):
print("狗看家")
继承的方式就是在其子类后面键入括号,里面加上要继承的基类即可。下面我们演示继承的实现:
class Animal:
def eat(self):
print("%s吃" % self.name)
def drink(self):
print("%s喝" % self.name)
def pee(self):
print("%s拉撒" % self.name)
class Cat(Animal):
def __init__(self, name):
self.name = name
self.breed = "猫"
def climb(self):
print("%s会爬树" % self.name)
class Dog(Animal):
def __init__(self, name):
self.name = name
self.breed = "狗"
def housekeeping(self):
print("%s会看家" % self.name)
cat = Cat("小喵喵")
cat.eat()
cat.drink()
cat.pee()
cat.climb()
dog = Dog("小狗狗")
dog.eat()
dog.drink()
dog.pee()
dog.housekeeping()
结果:
小喵喵吃
小喵喵喝
小喵喵拉撒
小喵喵会爬树
小狗狗吃
小狗狗喝
小狗狗拉撒
小狗狗会看家Process finished with exit code 0
以上演示的是单继承,那么多继承我们要怎么处理呢?要知道,Java和C#等语言只能继承一个类,但是Python允许多继承,其继承的方法有两种,分为深度优先和广度优先。
- 当类为经典类的时候,多继承的情况下,会按照深度优先的方式查找。
- 当类为新式类的时候,多继承的情况下,会按照广度优先的方式查找。
经典类和新式类:
经典类:当前类或者父类没有直接继承object类。如:
下面演示经典类的实例:
class D:
def bar(self):
print("D.bar")
class C(D):
def bar(self):
print("C.bar")
class B(D):
def bar(self):
print("B.bar")
class A(B, C):
def bar(self):
print("A.bar")
a = A()
a.bar()
结果:
A.bar
Process finished with exit code 0
分析:在执行bar()方法时,首先先去A类中查找,如果A中没有,就去B类中查找,如果B类没有,就去D类查找,如果D类没有,就去C类查找。
查找顺序:A——>B——>D——>C。
一旦找到,程序立刻中断,若是没有找到,报错。
新式类:当前类或者父类直接继承object类。如:
下列演示新式类实例:
class D(object):
def bar(self):
print("D.bar")
class C(D):
def bar(self):
print("C.bar")
class B(D):
def bar(self):
print("B.bar")
class A(B, C):
def bar(self):
print("A.bar")
a = A()
a.bar()
结果:
A.bar
Process finished with exit code 0
分析:在执行bar()方法时,首先先去A类中查找,如果A中没有,就去B类中查找,如果B类没有,就去C类查找,如果C类没有,就去D类查找。
查找顺序:A——>B——>C——>D。
一旦找到,程序立刻中断,若是没有找到,报错。