目录
一、继承介绍以及单继承
1.1程序中的继承(extend)
1.2单继承
1.3多继承
二、子类重写父类的同名属性和方法
三、super()的调用
一、继承介绍以及单继承
1.1程序中的继承(extend)
在程序中,继承描述的是多个类之间的所属关系。
如果一个类A里面的属性和方法可以复用,则可以通过继承的方式,传递到类B里。
那么类A就是基类,也叫做父类;类B就是派生类,也叫做子类。
# 父类
class A(object):#括号里的object是所有类的父类,金字塔的存在顶尖唯一
def __init__(self):#init是初始化方法
self.num = 10
def print_num(self):
print(self.num + 10)
# 子类
class B(A):#括号里写什么就继承什么,里面是A:所以是继承A类
pass
b = B()
print(b.num)
b.print_num()
1.2单继承
单继承:子类只能继承一个父类
class Animal():
def __init__(self):
self.animalType = "动物种类"
def isAnimal(self):
print("这个动物是%s"%self.animalType)
class Cat(Animal):#括号里写什么就继承什么
pass
a = Cat()#定义一个a接收子类Cat()
print(a.animalType)#子类调用父类的属性
a.isAnimal()#子类调用父类的方法
运行结果:
注意:
虽然子类没有定义
__init__
方法初始化属性,也没有定义实例方法,但是父类有。所以只要创建子类的对象,就默认执行了那个继承过来的__init__
方法
- 子类在继承的时候,在定义类时,小括号()中为父类的名字
- 父类的属性、方法,会被继承给子类(非私有的才可以!!!!)
1.3多继承
多继承:子类继承多个父类
class Animal():#父类Animal()
def __init__(self):#init默认的属性
self.animalType = "动物种类111111"
def isAnimal(self):
print("这个动物是%s111111"%self.animalType)
class Animal2():#父类Animal2()
def __init__(self):#init默认的属性
self.animalType = "动物种类222222"
def isAnimal(self):
print("这个动物是%s222222"%self.animalType)
class Cat(Animal,Animal2):#子类多继承两个父类
pass
b = Cat()#定义一个b接收子类Cat()
print(b.animalType)#子类调用父类的属性
b.isAnimal()#子类调用父类的方法
运行结果:
注意;
- 多继承可以继承多个父类,也继承了所有父类的属性和方法
- 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)
- 多个父类中,不重名的属性和方法,不会有任何影响。
二、子类重写父类的同名属性和方法
class Animal(): # 父类Animal()
def __init__(self): # init默认的属性
self.animalType = "动物种类111111"
def isAnimal(self):
print("这个动物是%s111111" % self.animalType)
class Animal2(): # 父类Animal2()
def __init__(self): # init默认的属性
self.animalType = "动物种类222222"
def isAnimal(self):
print("这个动物是%s222222" % self.animalType)
class Cat(Animal, Animal2): # 子类多继承两个父类
def __init__(self):
self.animalType = "子类333333"
def isAnimal(self):
print("这个子类是%s333333" % self.animalType)
b = Cat() # 定义一个b接收子类Cat()
print(b.animalType) # 子类重写父类的属性
b.isAnimal() # 子类重写父类的方法
运行结果:
三、super()的调用
class Animal(): # 父类Animal()
def __init__(self): # init默认的属性
self.animalType = "动物种类111111"
def isAnimal(self):
print("这个动物是%s111111" % self.animalType)
class Animal2(Animal): # 继承Animal!!!!!!!!!!!!!!!
def __init__(self): # init默认的属性
self.animalType = "动物种类222222"
def isAnimal(self):
print("这个动物是%s222222" % self.animalType)
super().__init__()
super().isAnimal() # 继承父类调用父类的方法所以打印是:这个动物是动物种类111111111111
class Cat(Animal2, Animal):
def __init__(self):
self.animalType = "子类333333"
def isAnimal(self):
self.__init__()
print("这个子类是%s333333" % self.animalType)
def isCat(self):
super().__init__() # 执行父类的 __init__方法
super().isAnimal() # 执行父类的 实例方法
self.isAnimal() # 执行本类的实例方法
b = Cat() # 定义一个b接收子类Cat()
b.isAnimal()
b.isCat()
运行结果:
子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。
使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。
注意:
如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,
目前super()不支持执行多个父类的同名方法)
super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。