zoukankan      html  css  js  c++  java
  • 面向对象的三大特性之继承基础

    继承:继承是一种创建新类的方式

      在python中,新建的类可以继承一个或者多个父类(基类或者超类),新建的类称为子类或派生类。python中的继承分为俩种,单继承和多继承。不是所有的语言都有多继承,例Java不支持

    查看继承的方法 __bases__

    class A:pass
    class B:pass
    class C(B,A):pass
    print(C.__bases__)  #(<class '__main__.B'>, <class '__main__.A'>)

    提示:在python3X中如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现。

    继承与抽象(先抽象后继承)

    抽象的作用是为了划分类别(可以隔离关注点,降低复杂度)

    继承:是基于抽象的结果,通过编程语言去实现它,肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构

    继承与重用:子类(派生类)可以使用父类的所有属性和方法

    class A:pass    #父类
    class B(A):pass     #子类(派生类)

    继承与派生:子类在父类的基础上又先创建了自己需要的方法和属性

    方法调用的顺序:

      子类在调用方法时,如果这个方法子类中有,就直接执行子类的方法,如果没有而父类有,子类对象就会调用父类的方法执行。

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

        父类名.方法名()   或者supper().方法名()

    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.name)
        def eat(self):
            print("吃%s"%self.food)
        def drink(self):
            print("喝水")
    class Cat(Animal):
        def __init__(self,name,kind,food,language,eye_color):
    
            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)    #调用类中eat的方法
            # super().eat()
            self.weight = 10
    阿猫 = Cat('阿猫','橘猫','牛杂','喵喵',"绿色")
    阿猫.eat()        #吃牛杂
    print(阿猫.weight)    #10

    面试例题:

    class Foo:
        def __init__(self):
            self.func()     #当类实例化时会直接执行func()方法
        def func(self):
            print("in   Foo")
    class Son(Foo):     #继承Foo类
        def func(self):
            print("in Son")
    s1 = Son()    #输出为 in Son        #实例化Son()  

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

    运用在多人开发,复杂的需求,后期扩展。    是一种手段来帮助我们完成规范

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

    多继承:就是一个子类同时继承多个父类

      新式类

      在新式类中所有多继承关系寻找方法的顺序---遵循广度优先算法   类名.mro()  查询继承方法的顺序

        在python3中所以的类都是新式类。所以的新式类都有一个默认的父类:object

    class Person1:pass
    class Person2():pass
    class Person3(object):pass
    # p = Person2()  # __init__ 初始化方法
    print(Person1.__bases__)    #(<class 'object'>,)
    print(Person2.__bases__)    #(<class 'object'>,)
    print(Person3.__bases__)    #(<class 'object'>,)

      钻石继承法:

      

      经典类:

      经典类在找父类的方法过程中遵循---深度优先算法。不提供mro方法和super

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

    # class Student:pass # 经典类
    # class Student(object):pass    #新式类

    接口类(了解)

    # 接口 Interface  接口可以被多继承
    
    # Interface FlyAnimal:  # 规范继承我的类必须实现这个方法
        # def fly():pass
    
    # Interface WalkAnimal:
        # def walk():pass
    
    # Interface SwimAnimal:
        # def swim():pass
    
    # class Tiger(WalkAnimal,SwimAnimal):  继承了一个规范
    #     def walk():代码
    #     def swim():代码
    
    # 抽象类
    # 接口
  • 相关阅读:
    安装依赖包
    python之高阶函数编程
    ubuntu之安装java浏览器插件
    python之函数式编程
    openstack第1天
    mysql null 相关bug
    nginx 【转】
    python mock
    查看docker 内各个容器的ip
    python sqlparse 各种 token
  • 原文地址:https://www.cnblogs.com/yuncong/p/9549793.html
Copyright © 2011-2022 走看看