目录

一、继承介绍以及单继承

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()#子类调用父类的方法

运行结果:

python父类方法 python父类和子类单继承_python

注意: 

虽然子类没有定义__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()#子类调用父类的方法

 运行结果:

python父类方法 python父类和子类单继承_python父类方法_02

注意; 

  • 多继承可以继承多个父类,也继承了所有父类的属性和方法
  • 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性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()

运行结果:

python父类方法 python父类和子类单继承_python_03

子类继承了多个父类,如果父类类名修改了,那么子类也要涉及多次修改。而且需要重复写多次调用,显得代码臃肿。

使用super() 可以逐一调用所有的父类方法,并且只执行一次。调用顺序遵循 mro 类属性的顺序。

注意:

如果继承了多个父类,且父类都有同名方法,则默认只执行第一个父类的(同名方法只执行一次,

目前super()不支持执行多个父类的同名方法)

super() 在Python2.3之后才有的机制,用于通常单继承的多层继承。