面向对象的三大特性之继承基础

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

  在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():代码

# 抽象类
# 接口

 

posted @ 2018-08-28 17:41  云丛  阅读(110)  评论(0编辑  收藏  举报