一:继承
1.什么是继承?
继承是新建类的一种方式
新建的类我们称之为子类或者叫派生类
被继承的类我们称之为父类或者基类
子类可以使用父类中的属性或者方法
2.为什么要用继承?
类解决了对象与对象之间的代码冗余问题
继承解决的是类与类之间的代码冗余问题
3.如何使用继承?
新式类: 继承了object类的子子孙孙类都是新式类
经典类: 没有继承了object类的子子孙孙类都是经典类
新式类和经典类只有在python2中区分
因而在Python3中统一都是新式类
二:类的继承
1.不使用继承之前:如下
不使用继承
class Animal:
def run(self):
print('走路')
def eat(self):
print('吃饭')
class Dog:
def run(self):
print('走路')
def eat(self):
print('吃饭')
def speak(self):
print('汪汪叫')
class Person:
def run(self):
print('走路')
def eat(self):
print('吃饭')
def work(self):
print('上班')
这样人和狗都有共同的特性 走路和吃饭 就有重复的特性 使得代码冗余
这样就可以使用继承来解决这个问题
继承的特性是:子类会遗传父类的属性和方法
继承是类与类之间的关系
使用继承:
Dog子类Person子类都继承Animal父类
class Animal: # 它作为父类
head = 1
def run(self):
print('走路')
def eat(self):
print('吃饭')
# 子类会遗传父类的属性和方法
class Dog(Animal): # 它做为子类
def speak(self):
print('汪汪叫')
# 子类会遗传父类的属性和方法
class Person(Animal): # 它做为子类
def work(self):
print('工作')
dog = Dog()
dog.eat() # 打印结果: 吃饭
print(dog.head) # 打印结果: 1
三,单继承下属性查找
单继承下属性查找:
查询顺序:先从对象名称空间中查找--》产生对象的类名称空间查找--》继承的父类中查找
class Foo:
def f1(self):
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.f1()
def Bar(Foo):
def f1(self):
print('Bar.f1')
obj = Bar()
obj.f2() 输出结果: Foo.f2 Bar.f1
1.单继承:进阶版
class Foo:
def __f1(self): _Foo__f1()
print('Foo.f1')
def f2(self):
print('Foo.f2')
self.__f1() _Foo__f1()
class Bar(Foo):
def __f1(self): _Bar__f1()
print('Bar.f1')
obj = Bar() {}
obj.f2() 结果 Foo.f2 Bar.f1
四:继承与抽象
要找出类与类之间的继承关系,需要先抽象,再继承。抽象即总结相似之处,总结对象之间的相似之处得到类,总结类与类之间的相似之处就可以得到父类,如下图所示
基于抽象的结果,我们就找到了继承关系
基于上图我们可以看出类与类之间的继承指的是什么’是’什么的关系(比如人类,猪类,猴类都是动物类)。子类可以继承/遗传父类所有的属性,因而继承可以用来解决类与类之间的代码重用性问题。
五,多继承的继承应用
多继承的基础应用
class Animal(): 括号什么都没有 表示没有继承
class Animal:
def run(self):
print('走路')
class Coder:
def work(self):
print('写代码')
class Person(Animal, Coder): 可以多继承 类的属性和方法
def eat(self):
print('吃饭')
p=Person()
p.run() 输出结果走路
p.run() 输出结果:走路
p.run() 输出结果:走路
六,多继承下的属性查找
新式类:按照广度优先查询
经典类:按照深度优先查询
class A(object):
def test(self):
print('from A')
class B(A):
def test(self):
print('from B')
pass
class C(A):
def test(self):
print('from C')
pass
class D(B):
def test(self):
print('from D')
pass
class E(C):
def test(self):
print('from E')
pass
class F(D, E): 多继承 按照从左往右查找
def test(self):
print('from F')
pass
f1 = F()
f1.test()
1.新式类:按照广度优先查询
新式类
'''
如果一个类继承了object,这个类就是新式类
python3中,所有类都默认继承了object(不写也会继承object类),所以所有类都是新式类
'''
学生
class Student(object):
pass
教师
class Teacher:
pass
学校
class School(Student, Teacher):
pass
查看一个类,继承了哪些父类
print(School.__bases__)
print(Teacher.__bases__)
print(School.__bases__)
2.经典类:按照深度优先
经典类
没有继承任何父类的 就叫经典类 只有python2中才有
python2中如果要写新式类,需要手动继承object
# 如果在python2中
class Student(object): # 新式类
pass
class Teacher(): # 经典类
pass
python2中的语法
print Student.__bases__ # (<type 'object'>,)
print Teacher.__bases__ # ()
新式类和经典类的属性查找顺序是不一样的