文章目录
一.继承
1.定义
-
继承描述的是事务之间的所属关系,当我们定义一个class的时候,可以从某个现有的class继承
-
新的class称为子类、扩展类(Subclass)
-
被继承的class称为基类、父类或超类(Baseclass,Superclass)
继承的实现: -
在定义类时,()中添加父类的名称
-
如果没有指定父类,默认继承Object类
#父类:object 子类:Student
class Student(object):
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def learning(self):
print('%s正在学习'%(self.name))
#父类:Student,子类:MathStudent
class MathStudent(Student):
pass
stu1=MathStudent('张三',18,'男')
stu1.learning()
结果
张三正在学习
2.继承的工作机制
(1)父类的属性和方法被继承给子类
如果子类没有定义__init__方法,而父类有,则子类会继承父类的这个方法;
所以只要创建对象,就默认执行了继承过来的__init__方法。
(2)调用父类的方法
父类名.父类的方法名()
super() 方法
#父类:object 子类:Student
class Student(object):
def __init__(self,name,age,gender):
self.name=name
self.age=age
self.gender=gender
def learning(self):
print('%s正在学习'%(self.name))
#父类:Student,子类:MathStudent 子类继承了父类的属性和方法
class MathStudent(Student):
def learning(self):
#调用父类方法一:Student.learning(self)
#调用父类方法二:super() 便于代码维护,不用再代码里面进行修改
super(MathStudent, self).learning() #super()自动寻找当前类的父类名对应的方法
print('%s正在学习'%(self.name))
stu1=MathStudent('张三',18,'男')
stu1.learning()
结果
张三正在学习
3.多继承
即子类有多个父类,并且具有它们的属性和方法
class TeacherMajor(object):
def __init__(self,student_count):
self.student_count=student_count
class DoctorMajor(object):
def __init__(self,patient_count):
self.patient_count=patient_count
class Student(TeacherMajor,DoctorMajor):
def __init__(self,name,student_count,patient_count):
self.name=name
TeacherMajor.__init__(self,student_count)
DoctorMajor.__init__(self,patient_count)
#print(子类.__mro__) 查看继承的顺序
stu1=Student('张三',100,20)
print(stu1.student_count)
print(stu1.patient_count)
结果
100
20
4.新式类和经典类
在python2及以前的版本中,由任意内置类型派生出来的类,都属于”新式类“,都会获得所有”新式类“的特性;反之,即不由任何内置类型派生出来的类,则称为”经典类“
python3中只有经典类
- 新式类
class 类名(object):
pass
- 经典类
Process finished with exit code 0
- 区别
在多继承中,新式类和经典类的继承顺序不一样。
***新式类:***广度优先算法,现在水平查找,再向上查找;
***经典类:***深度优先算法,先深入继承树左侧查找,然后再返回,从右侧开始查找。
5.私有属性和私有方法
私有:只有在类内部访问,在类外部访问不到。
(1)如何定义私有属性和私有方法
在封装属性和定义方法时,在名称的前面加两个双下划线
class Student(object):
"""
需求:学生成绩保密,外部不可以访问分数,只可以访问分数的等级
"""
def __init__(self,name,age,score):
self.name=name
self.age=age
self.__score=score #定义为私有属性
def __get_level(self):
if 90<self.__score<=100:
return '优秀'
elif 80<self.__score<=90:
return '良好'
elif 60<self.__score<=80:
return '及格'
else:
return '不及格'
stu1=Student('张三',10,92)
stu1.__get_score()
print('学生的成绩等级:',stu1.__get_leve())
结果报错,由于__get_level()是私有属性
Traceback (most recent call last):
File "D:/python课外学习/练习/私有属性和私有方法.py", line 26, in <module>
stu1.__get_score()
AttributeError: 'Student' object has no attribute '__get_score'
其实访问不到的实质是: python解释器将属性和方法名称修改了。
python2版本将_属性名改成了_类名_属性名,所以,仍然可以通过_类名_属性名访问;
但是,不同版本的python解释器有不同的修改格式
(2)私有属性和方法的优点
- 确保外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮
- 如果又要允许外部代码修改属性时,可以给类增加专门的设置属性方法。
二.多态
1.定义
- 多态(Pilymorphism)按字面的意思就是”多种状态“。
- 在面向对象语言中,接口的多种不同的实现方式即为多态。
- 通俗来说,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果
2.优点
- 当我们需要传入更多的子类,只需要传入子类就可以了,而方法既可以直接继承父类的,也可以重写一个不同于父类而特有的。
- 调用方只管调用,不管细节,而当我们新增一种子类时,只要确保新方法编写正确,不用担心原来的代码会被改变
即开闭原则: 对扩展开放(允许子类重写父类);对修改关闭(扩展新方法时,不会修改旧的代码)