面向对象三大特性之--继承,多态

一.继承

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.优点

  • 当我们需要传入更多的子类,只需要传入子类就可以了,而方法既可以直接继承父类的,也可以重写一个不同于父类而特有的。
  • 调用方只管调用,不管细节,而当我们新增一种子类时,只要确保新方法编写正确,不用担心原来的代码会被改变
    即开闭原则: 对扩展开放(允许子类重写父类);对修改关闭(扩展新方法时,不会修改旧的代码)
发布了36 篇原创文章 · 获赞 0 · 访问量 291

猜你喜欢

转载自blog.csdn.net/ANingL/article/details/103825849