面向对象的三大特性之继承基础
继承:继承是一种创建新类的方式
在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():代码 # 抽象类 # 接口