【学习笔记】--- 老男孩学Python,day18 面向对象------继承

时间:2023-03-10 01:31:03
【学习笔记】--- 老男孩学Python,day18 面向对象------继承

继承

继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,

父类又可称为基类或超类,新建的类称为派生类或子类

python中类的继承分为:单继承和多继承

 class FatherClass1:    #定义父类1
     pass

 class FatherClass2:    #定义父类2
     pass

 class SonClass(FatherClass1):   #单继承
     pass

 class SonClass(FatherClass1,FatherClass2):  #多继承
     pass

查看继承

 >>> SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类
 (<class '__main__.ParentClass1'>,)
 >>> SubClass2.__bases__
 (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

继承的优点:

a,提高了代码的复用性  b:提高了代码的维护性  c:让类与类之间产生了关系,是多态的前提

继承使用方法:

# 只执行父类的方法: ----------------------子类中不要定义与父类同名的方法
# 只执行子类的方法: ----------------------在子类创建这个方法.
# 既要执行子类的方法, 又要执行父类的方法:-----super().

 #  写三个类: 狗,猫,鸡, 每个类中都有 吃 喝  自己的方法  最后定义一个Animal类,

 class Animal:

     def __init__(self, name, sex, age):
         self.name = name
         self.sex = sex
         self.age = age

     def eat(self,a1):
         print('%s吃%s' % (self.name,a1))

     def drink(self):
         print('%s喝东西' % (self.name))

 class Cat(Animal):

     def miaow(self):
         print('喵喵叫')
     # def eat(self):  # 只执行自己类中的方法
     #     print(666)

 class Brid(Animal):

     def __init__(self, name,sex,age,wing): # self b1对象 name '鹦鹉',sex '公',age 20,  wing '绿翅膀'
         '''
         self=b1对象
         name='鹦鹉'
         sex='公'
         age= 20,
         wing='绿翅膀'
         '''
         # Animal.__init__(self, name, sex, age)
         super().__init__(name,sex,age)  #  super(Brid,self).__init__(name,sex,age)
         self.wing = wing
     def bark (self):
         print('嗷嗷叫')

     def eat(self,argv):
         super().eat(argv)
         print('鸟吃虫子...')

 class Chook(Animal):
     def crow(self):
         print('大爷laiwanya')
 # cat1 = Cat('tom','公', 3)
 # # cat1.eat()
 # 只执行父类的方法:子类中不要定义与父类同名的方法
 # 只执行子类的方法:在子类创建这个方法.
 # 既要执行子类的方法,又要执行父类的方法?
 # 有两种解决方法.
     # 1,Animal.__init__(self, name, sex, age)
     # 1,super().__init__(name,sex,age)
 # cat1 = Cat('tom','公', 3,)

 b1 = Brid('鹦鹉','公',20,'绿翅膀')
 # print(b1.__dict__)
 b1.eat('金蝉')

多继承寻找方法:

经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

注意:在上述查找过程中,一旦找到,则寻找过程立即中断,便不会再继续找了

1、Python的类可以继承多个类,Java和C#中则只能继承一个类

2、Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先广度优先

【学习笔记】--- 老男孩学Python,day18 面向对象------继承

  • 当类是经典类时,多继承情况下,会按照深度优先方式查找

  • 当类是新式类时,多继承情况下,会按照广度优先方式查找

经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类。

【学习笔记】--- 老男孩学Python,day18 面向对象------继承 【学习笔记】--- 老男孩学Python,day18 面向对象------继承

【学习笔记】--- 老男孩学Python,day18 面向对象------继承

 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()
 # 执行bar方法时
 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错
 # 所以,查找顺序:A --> B --> D --> C
 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
 a.bar()

 经典类多继承

 经典类多继承
 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()
 # 执行bar方法时
 # 首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错
 # 所以,查找顺序:A --> B --> C --> D
 # 在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了
 a.bar()

 新式类多继承

 新式类多继承