一、多重继承,可以理解为一个子类有多个父类,并继承这些父类的属性和方法。
class ClassName(Class1,Class2MixIn,Class3MixIn...)
- Class1 为ClassName的父类,Class2MixIn和Class3MixIn为它的后父类,也就是它的附加的功能(这是我这么定义的)。
- 这种附加功能的设计方式,我们称为MixIn,所以给这些后父类的末尾添加“MixIn”,以便更好的识别。
# 实例1
# 创建Person父类,并绑定参数name
注释:全面教程,入门书籍,学习源码可以添加小编学习群943752371直接获取。
class Person(object):
def __init__(self,name):
self.name=name
# 创建TeachingMixIn类,使其继承object,并建立t_run方法
class TeachingMixIn(object):
def t_run(self):
print('teaching...')
# 创建LearningMixIn类,使其继承object,并建立s_run方法
class LearningMixIn(object):
def s_run(self):
print('learning...')
# 创建EatMixIn类,使其继承object,并建立eat方法
class EatMixIn(object):
def eat(self):
print('eating...')
# 创建Teacher类,使其继承父类Person、类TeachingMixIn(扩展功能)和类EatMixIn(扩展功能)
class Teacher(Person,TeachingMixIn,EatMixIn):
def my(self):
print('{0} is a teacher.'.format(self.name))
# 创建Student类,使其继承父类Person、类LearningMixIn(扩展功能)和类EatMixIn(扩展功能)
class Student(Person,LearningMixIn,EatMixIn):
def my(self):
print("{0} is a student".format(self.name))
a=Teacher('Zhangsan')
a.my()
a.eat()
a.t_run()
print('+'*15)
b=Student('Lisi')
b.my()
b.eat()
b.s_run()
>>>
Zhangsan is a teacher.
eating...
teaching...
+++++++++++++++
Lisi is a student
eating...
learning...
# 类Student继承了父类Person,又继承了扩展类LearningMixIn(Student独有的类)。类Teacher继承了父类Person,并继承了扩展类Teaching。
# Student和Teacher类都继承了EatMixIn类
当我们在使用多重继承的时候,如果继承的父类中有相同的属性或者方法的时候,会输出哪个属性或者执行哪个方法呢?我们实例看一下。
# 实例2
class A(object):
name='AAA'
def run(self):
print('This is A.')
class B(object):
name='BBB'
def run(self):
print('This is B.')
class C(A,B):
pass
a=C()
print(a.name)
a.run()
>>>
AAA
This is A.
# 父类 A 和后父类 B 都有同样的属性 name 和同样的方法 run 。python会优先使用父类 A 中的,而后父类(附加父类)的属性和方法就没用了。
总结:当我们使用多重继承的时候,一定要注意多重继承中父类的属性和方法是否和后父类重复,如果重复,优先使用父类中的属性和方法。
二、枚举类
red=1
green=2
white=3
black=4
yellow=5
blue=6
如果我们想要通过 1-6 来表示这六种颜色,可以通过常量表达。
# 实例1
RED=1
GREEN=2
WHITE=3
BLACK=4
YELLOW=5
BLUE=6
print(RED,GREEN,WHITE,BLACK,YELLOW,BLUE)
>>> 1 2 3 4 5 6
# 通过调用这些常量,正确的表达出来了
但是虽然这些常量使用起来简单方便,可我们知道,常量是可以改变的,这就增加了一些不稳定因素。我们可以使用枚举类来解决这些问题。
# 实例2
# 导入enum模块的Enum类
from enum import Enum
#创建Colour类,使其父类为Enum类
class Colour(Enum):
red=1
green=2
white=3
black=4
yellow=5
blue=6
n=1
# 迭代出Colour的所有成员
for j in Colour:
print(Colour(n),end=' ')
n+=1
print(' ')
# 迭代出Colour的所有成员的值
for i in Colour:
print(i.value,end=' ')
>>>
Colour.red Colour.green Colour.white Colour.black Colour.yellow Colour.blue
1 2 3 4 5 6
# enum类是可以通过迭代取出所有的成员,还可以通过值来找出成员的名称
所以,使用枚举类可以反着来取出成员,也可以通过成员来取出值,这是很方便的。而且,这里成员的值是不变的,增加了我们代码的稳定性。
网友评论