目录
一、继承介绍以及单继承
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()#子类调用父类的方法
运行结果:
image**注意: **
虽然子类没有定义
__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()#子类调用父类的方法
** 运行结果:**
image**注意; **
- 多继承可以继承多个父类,也继承了所有父类的属性和方法
- 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性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() # 子类重写父类的方法
** 运行结果:**
image
三、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()
运行结果:
image子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。
使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。
注意:
如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,
目前super()不支持执行多个父类的同名方法)
super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。
网友评论