zoukankan      html  css  js  c++  java
  • 继承 抽象类 多继承 接口类 新式类

    面向对象的三大特性:今天主要讲的继承      (继承 ,多态,封装)

    先抽象  》》》 后继承

         单继承

      继承 和抽象   语法:父类   子类

    继承与重用

    子类可以使用父类的名字(变量和方法)

    继承与派生

      子类在父类的基础上又新创建了自己需要的方法和属性

     父类有的 子类没有 -----子类对象直接调用  就会直接执行父类的方法

     父类有的 子类也有------子类对象调用  直接执行子类中的方法

        想在子类中使用父类的名字:  父类名字 .    或者  super()去调用

    多继承

    # 语法
    # 接口
    # 新式类和经典类
    # 新式类中
    # 所有的多继承关系寻找方法的顺序 - 遵循广度优先算法
    # 继承object
    # mro方法
    # super : super不是单纯的找父类,而是遵循mro顺序的

    # 经典类
    # python2.x
    # 不主动继承object
    # 经典类在找父类中方法的过程中 遵循 —— 深度优先
    # 不提供mro方法和super

    ----------------------------------------------------------------------------------------------------------------------------------

    猫类 :
        属性 : 名字,品种,食物
        方法 : 叫,抓老鼠,吃,喝
    狗类 :
        属性 : 名字,品种,食物
        方法 : 叫,看家,吃,喝
    class Animal:
        def __init__(self,name,kind,food,language):
            self.name = name
            self.kind = kind
            self.food = food
            self.language = language
        def yell(self):
            print('%s叫'%self.language)
        def eat(self):
            print('吃%s'%(self.food))
        def drink(self):
            print('喝水')
    
    class Cat(Animal):
        def catch_mouse(self):
            print('抓老鼠')
    
    class Dog(Animal):
        def look_after_house(self):
            print('看家')


    阿猫 = Cat('阿猫','橘猫','牛杂','喵喵')
    print(阿猫.name)
    阿猫.drink()
    阿猫.eat()
    阿猫.yell()

    阿狗 = Dog('阿狗','土狗','阿猫','汪汪')
    print(阿狗.name)
    阿狗.drink()
    阿狗.eat()
    阿狗.yell()

    继承 

    父类也叫超类 基类 :Animal

    子类也叫派生类: Cat     Dog

    继承与重用  : 父类中所有的属性 和 方法都可以被子类 使用!

    派生

    class Animal:
        def __init__(self,name,kind,food,language):
            print('in animal')
            self.name = name
            self.kind = kind
            self.food = food
            self.language = language
        def yell(self):
            print('%s叫'%self.language)
        def eat(self):
            print('吃%s'%(self.food))
        def drink(self):
            print('喝水')
    
    class Cat(Animal):   # Animal的派生类
        def __init__(self,name,kind,food,language,eye_color):
            print('in Cat')
            self.eye_color = eye_color    # 派生属性
            Animal.__init__(self,name,kind,food,language)
            # super().__init__(name,kind,food,language)
    
        def catch_mouse(self):   # 派生方法
            print('抓老鼠')
    
        def eat(self):           # 不仅执行了父类中的基础功能,还完成了特殊的功能
            Animal.eat(self)
            # super().eat()
            self.weight = 10
    
    class Dog(Animal):
        def look_after_house(self):
            print('看家')
    
        def eat(self):
            # Animal.eat(self)
            super().eat()
            self.drink()
    
    阿猫 = Cat('阿猫','橘猫','牛杂','喵喵','绿色')
    print(阿猫.eye_color)
    print(阿猫.food)
    阿猫.catch_mouse()
    阿猫.eat()
    print(阿猫.weight)

    当子类当中有要被调用的方法的时候,子类的对象会直接选择子类中的方法,变量, 父类中的方法不会被自动执行。

    父类名 . 方法名(self,...)

    super(). 方法名(...)

    帮助我们在子类中调用父类中的同名方法

    抽象类: 工作中  公司有使用抽象类 来定 开发的命名规则

    # 支付功能
    from abc import ABCMeta,abstractmethod
    
    class Payment(metaclass=ABCMeta):   # 模板的功能
        @abstractmethod     # abstractmethod是一个装饰器,装饰器怎么用?放在函数/类的上一行
        def pay(self):pass
    
        @abstractmethod
        def shouqian(self):pass
    
    class Alipay(Payment):
        def pay(self,money):
            print('使用支付宝支付了%s元'%money)
    
    class Wechatpay(Payment):
        def pay(self,money):
            print('使用微信支付了%s元'%money)
    
    class ApplePay(Payment):
        def pay(self,money):
            print('使用applepay支付了%s元' % money)
    
    def pay(obj,money):
        obj.pay(money)
    
    p = Payment()
    规范
    多人开发、复杂的需求、后期的扩展
    手段 来帮助我们完成规范

    抽象类
    抽象类是一个规范,它基本不会实现什么具体的功能,抽象类是不能被实例化
    要想写一个抽象类
    from abc import ABCMeta,abstractmethod
    在这个类创建的时候指定 metaclass = ABCMeta
    在你希望子类实现的方法上加上一个 @abstractmethod装饰器
    使用抽象类
    继承这个类
    必须实现这个类中被@abstractmethod装饰器装饰的方法

    多继承;

    不是所有语言都支持多继承    java

    c++  支持多继承

    # 天鹅  飞 游泳 走路
    # 老虎  走路 游泳
    # 鹦鹉  飞 说话 走路
    # class Animal:
    #     def __init__(self,name):
    #         self.name = name
    #     def talk(self):
    #         print('%s说话了'%self.name)
    #
    #     def swim(self):
    #         print('%s在游泳'%self.name)
    #
    #     def fly(self):
    #         print('%s在飞'%self.name)
    #
    #     def walk(self):
    #         print('%s在走路'%self.name)
    class Animal:
        def __init__(self,name):
            self.name = name
    
    class FlyAnimal(Animal):
        def fly(self):
            print('%s在飞' % self.name)
    class WalkAnimal(Animal):
        def walk(self):
            print('%s在走路'%self.name)
    class SwimAnimal(Animal):
        def swim(self):
            print('%s在游泳'%self.name)
    
    class Tiger(SwimAnimal,WalkAnimal):
        pass
    
    class Swan(SwimAnimal,WalkAnimal,FlyAnimal):
        pass
    
    class Parrot(FlyAnimal,WalkAnimal):
        def talk(self):
            print('%s说话了'%self.name)
    
    swan = Swan('天鹅')
    swan.fly()
    swan.walk()

    接口类: 借口  Interface   借口可以被多继承

    新式类:

    在python3.x 版本中  所有类都是新式类

    所有新式类都有一个默认的父类 :object

    python 2.7
    经典类 和 新式类 并存
    class Student:pass # 经典类
    class Student(object):pass

    继承了object的类就是新式类
    在py3中所有的类都是新式类
    在py2中既有新式类又有经典类
    多继承的顺序 在新式类和经典类之间的区别

    新式类中
    所有的多继承关系寻找方法的顺序 - 遵循广度优先算法
    继承object
    mro方法
    super : super不是单纯的找父类,而是遵循mro顺序的

    经典类
    python2.x
    不主动继承object
    经典类在找父类中方法的过程中 遵循 —— 深度优先
    不提供mro方法和super
  • 相关阅读:
    每周一荐:代码编辑器sublime
    每周一荐:Google的序列化框架Protobuf
    每周一荐:ObjectiveC的开源开发环境GNUstep
    每周一荐:用gnuplot绘制函数曲线
    每周一荐:学习ACE一定要看的书
    临时变量管理器
    每周一荐:TotalCommand的文件夹同步功能
    每周一荐:支持latex的思维导图软件docear
    关于程序员面试的一点想法
    每周一荐:Python Web开发框架Django
  • 原文地址:https://www.cnblogs.com/single82/p/9550332.html
Copyright © 2011-2022 走看看