zoukankan      html  css  js  c++  java
  • 面向对象的三大特性

    面向对象的三大特性

    继承:

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

    python中类的继承可以分为单继承和多继承。

    class ParentClass1:#定义父类
        pass
    class ParentClass2:#定义父类
        pass
    class SubClass1(ParentClass1):#单继承,基类是ParentClass1,派生是SubClass
        pass
    class SubClass2(ParentClass1,ParentClass2):#python支持多继承,用逗号隔开多个继承的类
        pass
    单继承和多继承

    查看继承

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

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

    如果我们既想要执行子类的方法,也想要执行父类的方法,那么需要在子类的方法中调用父类的方法:

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

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

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

    #抽象类

    抽象类是一个规范,他基本不会实现什么具体的功能,抽象类是不能被实例化。

    要想写一个抽象类:

    from abc import ABCMeta,abstractmethod

    在这个类创建的时候指定 metaclass = ABCMeta

    在你希望子类实现的方法上加上一个 @abstractmethod装饰器

    使用抽象类:

    继承这个类

    必须实现这个类中被@abstractmethod装饰器装饰的方法

    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()
    抽象类

    #多继承

    # 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()
    # swan.swim()

    #新式类

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

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

    python2.7中经典类和新式类并存。

    多继承的顺序:钻石顺序

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

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

    class A(object):
        def test(self):
            print('from A')
    
    class B(A):
        def test(self):
            print('from B')
    
    class C(A):
        def test(self):
            print('from C')
    
    class D(B):
        def test(self):
            print('from D')
    
    class E(C):
        def test(self):
            print('from E')
    
    class F(D,E):
        # def test(self):
        #     print('from F')
        pass
    f1=F()
    f1.test()
    print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性
    
    #新式类继承顺序:F->D->B->E->C->A
    #经典类继承顺序:F->D->B->A->E->C
    #python3中统一都是新式类
    #pyhon2中才分新式类与经典类
    继承顺序

    #新式类和经典类的区别:

    新式类:1.所有的多继承关系寻找方法的顺序:遵循广度优先方法。

    2.继承object

    3.mro方法

    4.super:super不是单纯的找父类,而是遵循mro顺序的。

    经典类:1.不主动继承object

    2.在找父类的方法过程中遵循深度优先

    3.不提供mro方法和super

  • 相关阅读:
    购买成熟软件产品后的二次开发的问题
    outlook2010如何导入csv的通讯录?
    导入Excel数据时对数据校验提示方法
    系统开发中存储过程使用的优势和劣势
    FCKeditor.Net_2.5的使用
    [正则表达式]如何高亮显示搜索关键字
    国外网站模板网址集锦
    _NET 下 FCKeditor_2_5_1上传图片的配置
    用属性模拟多继承机制
    FCKeditor 2.6在ASP.NET中的配置方法
  • 原文地址:https://www.cnblogs.com/caoshitong/p/9549745.html
Copyright © 2011-2022 走看看