zoukankan      html  css  js  c++  java
  • day 4 继承

    1.继承引入,减少代码量

      1)版本1:

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog:
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
        def bark(self):
            print("-----汪汪叫---")
    
    a = Animal()
    a.eat()
    
    wangcai = Dog()
    wangcai.eat()
    ----吃----
    ----吃----

      2)版本2:继承动物类

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        '''
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
        '''
        def bark(self):
            print("-----汪汪叫---")
    
    a = Animal()
    a.eat()
    
    wangcai = Dog()
    wangcai.eat()

      3)版本3:

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        def bark(self):
            print("-----汪汪叫---")
    
    class Cat(Animal):
        def catch(self):
            print("---抓老鼠---")
    a = Animal()
    a.eat()
    
    wangcai = Dog()
    wangcai.eat()
    
    tom = Cat()
    tom.eat()

         

    2.子类继承父类的父类

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        def bark(self):
            print("-----汪汪叫---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞----")
    
    xiaotianquan = Xiaotq()
    xiaotianquan.fly()
    xiaotianquan.bark()
    xiaotianquan.eat()
    ---飞----
    -----汪汪叫---
    ----吃----

         

    3.重写

    先在自己的类中查找父类的同名方法,没有的话去父类查找

        

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        def bark(self):
            print("-----汪汪叫---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞----") 
        def bark(self):                 #定义和父类方法同名的方法,就是重写
            print("---重写叫---")
    
    xiaotianquan = Xiaotq()
    xiaotianquan.fly()
    xiaotianquan.bark()
    xiaotianquan.eat()
    ---飞----
    ---重写叫---
    ----吃----

    4.调用被重写的方法

      既要调用父类的方法,又要重写该方法

      1)版本1: Dog.bark(self)

    class Animal:
        '''定义一个动物类'''
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        def bark(self):
            print("-----汪汪叫---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞----")
        def bark(self):
            print("---重写叫---")
            
            #第一种调用被重写的父类的方法
            Dog.bark(self)
    
    xiaotianquan = Xiaotq()
    xiaotianquan.fly()
    xiaotianquan.bark()
    xiaotianquan.eat()
    ---飞----
    ---重写叫---
    -----汪汪叫---
    ----吃----

      2)版本2:super().dark()

    class Animal:
        '''定义一个动物类'''   
        def eat(self):
            print("----吃----")
        def drink(self):
            print("----喝----")
        def sleep(self):
            print("----睡觉----")
        def run(self):
            print("----跑----")
    
    class Dog(Animal):
        def bark(self):
            print("-----汪汪叫---")
    
    class Xiaotq(Dog):
        def fly(self):
            print("---飞----")
        def bark(self):
            print("---重写叫---")
            
            #第一种调用被重写的父类的方法
           # Dog.bark(self)
    
            #第2种
            super().bark()    #super()高级的,上级的
    
    xiaotianquan = Xiaotq()
    xiaotianquan.fly()
    xiaotianquan.bark()
    xiaotianquan.eat()

    5.私有属性私有方法,不能被直接继承

    私有属性私有方法可以被公有方法调用,公有方法可以被继承

      1)版本1:

     class A:
         def __init__(self):
             self.num1 = 100
             self.__num2 = 222
     
         def test1(self):
             print("---test1---")
     
         def __test2(self):
             print("--test2---")
     
     class B(A):
         pass
     
     b = B()
     b.test1()
     b.__test2() #私有方法不会被继承
     
     print(b.num1)
     print(b.__num2) #私有属性不会被继承
    ---test1---
    Traceback (most recent call last):
      File "09-私有在继承中的表现.py", line 17, in <module>
        b.__test2() #私有方法不会被继承
    AttributeError: 'B' object has no attribute '__test2'

       2)版本2:

    class A:
        def __init__(self):
            self.num1 = 100
            self.__num2 = 222
    
        def test1(self):
            print("---test1---")
    
        def __test2(self):
            print("--test2---")
    
    class B(A):
        pass
    
    b = B()
    b.test1()
    #b.__test2() #私有方法不会被继承
    
    print(b.num1)
    #print(b.__num2) #私有属性不会被继承
    ---test1---
    100

      3)版本3:通过公有方法调用

    class A:
        def __init__(self):
            self.num1 = 100
            self.__num2 = 222
    
        def test1(self):
            print("---test1---")
    
        def __test2(self):
            print("--test2---")
    
        def test3(self):
            self.__test2()
            print(self.__num2)
    
    class B(A):
        pass
    
    b = B()
    b.test1()
    #b.__test2() #私有方法不会被继承
    
    print(b.num1)
    #print(b.__num2) #私有属性不会被继承
    
    b.test3()   #公有方法调用私有属性方法
    ---test1---
    100
    --test2---
    222

      4)版本4:

    class A:
        def __init__(self):
            self.num1 = 100
            self.__num2 = 222
    
        def test1(self):
            print("---test1---")
    
        def __test2(self):
            print("--test2---")
    
        def test3(self):
            self.__test2()
            print(self.__num2)
    
    class B(A):
        def test4(self):
            self.__test2()
            print(self.__num2)
    
    b = B()
    b.test1()
    #b.__test2() #私有方法不会被继承
    
    print(b.num1)
    #print(b.__num2) #私有属性不会被继承
    
    b.test3()
    b.test4()
    ---test1---
    100
    --test2---
    222
    Traceback (most recent call last):
      File "09-私有在继承中的表现.py", line 29, in <module>
        b.test4()
      File "09-私有在继承中的表现.py", line 18, in test4
        self.__test2()
    AttributeError: 'B' object has no attribute '_B__test2'

        

    6.多继承

    经典类

     class Dog:
            pass

    新式类   object是所有类的父类

     class Dog(object):
            pass

      

    多继承

    class Base(object):
        def base(self):
            print("----this is base-")
    
    class A(Base):
        def test1(self):
            print("---this is A---")
    
    class B(Base):
        def test2(self):
            print("----this is B---")
    
    class C(A,B):
        pass
    
    c1 = C()
    c1.test1()
    c1.test2()
    c1.base() 
    ---this is A---
    ----this is B---
    ----this is base-

        

    7.多继承注意点

      切记:不要出现相同的方法名

      1)版本1:先调用自身的

    class Base(object):
        def test(self):
            print("----this is base-")
    
    class A(Base):
        def test(self):
            print("---this is A---")
    
    class B(Base):
        def test(self):
            print("----this is B---")
    
    class C(A,B):
        def test(self):
            print("----this is C---")
        
    c1 = C()
    c1.test()
    ----this is C---

      2)版本2:调用哪个父类的AorB?? 

     class Base(object):
         def test(self):
             print("----this is base-")
     
     class A(Base):
         def test(self):
             print("---this is A---")
     
     class B(Base):
         def test(self):
             print("----this is B---")
     
     class C(A,B):
         pass
        # def test(self):
         #    print("----this is C---")
     
     c1 = C()
     c1.test()
    ---this is A---

      3)版本3:调用顺序

     class Base(object):
         def test(self):
             print("----this is base-")
     
     class A(Base):
         def test(self):
             print("---this is A---")
     
     class B(Base):
         def test(self):
             print("----this is B---")
     
     class C(A,B):
         pass
        # def test(self):
         #    print("----this is C---")
     
     c1 = C()
     c1.test()
     print(C.__mro__)

        

  • 相关阅读:
    TouchAction实现连续滑动设置手势密码
    用命令方式启动、停止appium服务和app
    企业软件防火墙iptables
    磁盘分区
    docker-网络
    docker-镜像管理基础
    docker-简单操作
    docker-安装
    python-函数
    find一些常用参数的一些常用实例和一些具体用法和注意事项。
  • 原文地址:https://www.cnblogs.com/venicid/p/7890007.html
Copyright © 2011-2022 走看看