python全栈脱产第25天------组合、多态、封装、property装饰器

一、组合

  定义:组合指的是一个对象属性的值是另一个类的对象

  用途:通过某一对象添加属性(属性的值时另一个类的对象)的方式,可以间接地将两个类关联/整合/组合到一起,从而减少代码冗余

  用法:

    class OldboyPeople:

      school='Oldboy'

      def __init__(self,name,age,sex):

        self.name=name

        self.age=age

        self.sex=sex

    class OldboyStudent(OldboyPeople):

      def __init__(self,name,age,sex,score=0):

        super().__init__(name,age,sex)

        self.score=score

        self.courses=[]

      def choose_course(self):

        print('%s choosing course' %self.name)

      def tell_all_course(self):

        print(('学生[%s]选修的课程如下' %self.name).center(50,'='))

        for obj in self.course:

          obj.tell_info()

        print('='*60)

    class OldboyTeacher(OldboyPeople):

      def __init__(self,name,age,sex,level):

        super().__init__(name,age,sex)

        self.level=level

        self.courses=[]

      def score(self,stu,num)

        score.stu=num

      def tell_all_course(self):

        print(('老师[%s]教授的课程如下' %self.name).center(50,'*'))

        for obj in self.course:

          obj.tell_info()

        print('*'*70)

    class Course:

      def __init__(self,c_name,c_price,c_period):

        self.c_name=c_name

        self.c_price=c_price

        self.c_period=c_period

      def tell_info(self):

        print('<课程名:%s 价钱:%s 周期:%s>' %(self.c_name,self.c_price,self_period))

    python=Course('python全栈开发',1900,'5mons')

    linux=Course('linux架构师',900,'3mons')

    stu1=OldboyStudent('刘二蛋',38,'male')

    stu1.courses.append(python)

    stu1.courses.append(linux)

    stu1.tell_all_course()

    tea1=OldboyTeacher('egon',18,'male')

    tea1.courses.append(python)

    tea1.tell_all_course()

二、多态

  定义:多态指同一种/类事物不同的形态

  用途:多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象

     多态性的精髓:统一

  用法:

    import abc

    class xxx(metaclass=abc.ABCMeta):

      @abc.abstractmthod

      def yyy(self):

        pass

    父类只是用来建立规范的,不能用来实例化,更无需实现内部的方法

  鸭子类型:只要各方面都像什么,则被认为就是什么

三、封装

  定义:装:往容器/名称空间里存入名字

     封:代表将存放于名称空间中的名字隐藏起来,这种隐藏对外不对内

  用途:封装数据属性:将数据属性隐藏起来,类外就无法直接操作属性,需要类内开辟一个接口,来间接地操作属性,可以在接口内定义控制逻辑,从而严格控制对属性的操作

     封装函数属性:隔离复杂度

  用法:在类内定义的属性前加__开头(没有__结束)

     总结:1.__开头的属性实现的隐藏仅仅只是一种语法意义上的变形,并不会真的限制类外部的访问

        2.该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增__开头的属性并不会变形

        3.如果父类不想让子类覆盖自己的属性,可以在属性前加__开头

原文地址:https://www.cnblogs.com/zhouyi0316/p/9513517.html