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

  • 相关阅读:
    67. Add Binary
    66. Plus One
    64. Minimum Path Sum
    63. Unique Paths II
    How to skip all the wizard pages and go directly to the installation process?
    Inno Setup打包之先卸载再安装
    How to change the header background color of a QTableView
    Openstack object list 一次最多有一万个 object
    Openstack 的 Log 在 /var/log/syslog 里 【Ubuntu】
    Git 分支
  • 原文地址:https://www.cnblogs.com/caoshitong/p/9549745.html
Copyright © 2011-2022 走看看