pythonday17

一, 继承

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

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

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

        class ParentClass1: #定义父类
            pass

        class ParentClass2: #定义父类
            pass

        class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass
            pass

        class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类
            pass

  2. 查看继承

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

  提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基

  类,它提供了一些常见方法(如__str__)的实现。

        >>> ParentClass1.__bases__
        (<class 'object'>,)
        >>> ParentClass2.__bases__
        (<class 'object'>,)

  3. 继承的重要性

========================第一部分
        例如
   
          猫可以:爬树、吃

          狗可以:看门、吃

        如果我们要分别为猫和狗创建一个类,那么就需要为 猫 和 狗 实现他们所有的功能,伪代码如下:
 

        #猫和狗有大量相同的内容
        class 猫:

            def爬树(self):
                print '爬树'

            def 吃(self):
                # do something

        class 狗:

            def 看门(self):
                print '看门'

            def 吃(self):
                # do something


========================第二部分
        上述代码不难看出,吃是猫和狗都具有的功能,而我们却分别的猫和狗的类中编写了两次。如果使用 继承 的思想,
        如下实现:

          动物:吃

             猫:爬树(猫继承动物的功能)

             狗:看门(狗继承动物的功能)

        伪代码如下:
        class 动物:

            def 吃(self):
                # do something
      
        # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
        class 猫(动物):

            def爬树(self):
                print '爬树'

        # 在类后面括号中写入另外一个类名,表示当前类继承另外一个类
        class 狗(动物):

             def 看门(self):
                print '看门'


========================第三部分
       #继承的代码实现
        class Animal:

            def eat(self):
                print("%s 吃 " %self.name)


        class Cat(Animal):

            def __init__(self, name):
                self.name = name
                self.breed = ''

            def爬树(self):
                print '爬树'

        class Dog(Animal):

            def __init__(self, name):
                self.name = name
                self.breed=''
  
            def 看门(self):
                print '看门'


# ######### 执行 #########

        c1 = Cat('小白家的小黑猫')
        c1.eat()


        d1 = Dog('胖子家的小瘦狗')
        d1.eat()

        使用继承来重用代码比较好的例子    

   

  4. 继承的好处

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

  5. 

        class Animal:
            zhuangtai='能运动'
            qiguan='有大脑'
            def __init__(self,name,sex,age):
                self.name=name
                self.sex=sex
                self.age=age
           def food(self):
                print('不好吃')

        class Person(Animal):
            def __init__(self, name, sex, age,shenggao):
                Animal.__init__(self, name, sex, age) #用类名调用方法,调用父类中的构造方法并执行.
                #super().__init__(name,sex,age)
                self.shenggao=shenggao

            def work(self,):
                print('每天上班')


        class Dog(Animal):
           def food(self):
                super().food()     #用super关键字使父类与子类中的food方法调用                                           #法都执行,super自动把self接收到的对象传给
                                # 父类,不用在其()内写self
                print('屎很香')


        p1=Person('','','20',165)
        d1=Dog('旺财','',10)
        print(p1.zhuangtai)     #用对象调用父类
        print(Person.zhuangtai)    #用类调用父类
        print(p1.__dict__)
        d1.food()                


二, 多继承

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

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

   深度优先广度优先

 

  

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

  3. 经典类和新式类,从字面上可以看出一个老一个新,新的必然包含了跟多的功能,也是之后

  推荐的写法,从写法上区分的话,如果 当前类或者父类继承了object类,那么该类便是新

  式类,否则便是经典类。

 

 

   4. 经典多继承

        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()

   5. 新类多继承

        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()

  经典类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续

   去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错

  新式类:首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中么有,则继续

   去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错

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

猜你喜欢

转载自www.cnblogs.com/panda-pandeyong/p/9368562.html