• Python面向对象(组合、菱形继承、多态)


    今日内容:
     1.组合
     2.菱形继承
     3.多态与多态性

     昨天内容重点回顾:
     1)调用也叫实例化:发生了2件事
      1.创造空对象
      2.触发对象下的__init__方法,然后将p连同参数一同传给init
     2)绑定关系
      1.类的调用就是普通函数
      2.大多数给对象调用的,绑定给对象用的
        绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入
     精髓:对象不仅是一系列数据(自己独有的+与其他对象共有的),还包含专门操作该数据的方法
     

    1.组合
     1、什么是组合
        组合就是一个类的对象具备某一个属性,该属性的值是指向另外外一个类的对象

     2、为何用组合
      组合也是用来解决类与类直接代码冗余问题的

     3、如何用组合
     
     实例:选课系统
     class Course:
        def __init__(self,name,period,price):
            self.name=name
            self.period=period
            self.price=price

        def tell_info(self):
            msg="""
            课程名:%s
            课程周期:%s
            课程价钱:%s
            """ %(self.name,self.period,self.price)
            print(msg)

     #老师和学生的父类
     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,stu_id):
       OldboyPeople.__init__(self,name,age,sex)
       self.stu_id=stu_id

      def choose_course(self):
       print('%s is choosing course' %self.name)
     #老师类
     class OldboyTeacher(OldboyPeople):

      def __init__(self, name, age, sex, level):
       OldboyPeople.__init__(self,name,age,sex)
       self.level=level

      def score(self,stu,num):
       stu.score=num
       print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num))

     # 创造课程
     python=Course('python全栈开发','5mons',3000)
     linux=Course('linux运维','5mons',800)
     # python.tell_info()
     # linux.tell_info()
     # 创造学生与老师
     stu1=OldboyStudent('猪哥',19,'male',1)
     tea1=OldboyTeacher('egon',18,'male',10)
     stu1.choose_course()
     tea1.score(stu1,99)
     # 》》》》实现的目的是直接通过stu1和teal调用课程
     # 将学生、老师与课程对象关联/组合
     stu1.course=python                      #》》》》通过中间变量的值指向课程类的对象
     tea1.course=linux
     stu1.course.tell_info()
     tea1.course.tell_info()

     """
     super去改写版本:
     class OldboyStudent(OldboyPeople):
      def __init__(self,name,age,sex,stu_id):
       # OldboyPeople.__init__(self,name,age,sex)
       super(OldboyStudent,self).__init__(name,age,sex,)
       self.stu_id=stu_id

      def choose_course(self):
       print('%s is choosing course' %self.name)

     class OldboyTeacher(OldboyPeople):

      def __init__(self, name, age, sex, level):
       # OldboyPeople.__init__(self,name,age,sex)
       super(OldboyTeacher,self).__init__(name,age,sex)
       self.level=level

      def score(self,stu,num):
       stu.score=num
       print('老师[%s]为学生[%s]打分[%s]' %(self.name,stu.name,num))

     """

    2.菱形继承
     '''
     1、菱形继承
      当一个子继承多个父类时,多个父类最终继承了同一个类,称之为菱形继承

     2、菱形继承的问题:
      python2区分经典类与新式类,如果子的继承是一个菱形继承,那么经典类与形式的区别为?
       经典类下查找属性:深度优先查找
       新式类下查找属性:广度优先查找

     '''
     class G(object):
        # def test(self):
        #     print('from G')
        pass

     class E(G):
      # def test(self):
      #     print('from E')
      pass

     class B(E):
      # def test(self):
      #     print('from B')
      pass

     class F(G):
      # def test(self):
      #     print('from F')
      pass

     class C(F):
      # def test(self):
      #     print('from C')
      pass

     class D(G):
      # def test(self):
      #     print('from D')
      pass

     class A(B,C,D):
      def test(self):
       print('from A')
      # pass

     obj=A()
     print(A.mro())
     # obj.test() #A->B->E-C-F-D->G-object
     
     
     
     

    3.多态
     ""
     1 什么是多态
      多态指的是同一种事物的多种形态
       水-》冰、水蒸气、液态水
       动物-》人、狗、猪

     2 为和要用多态
      多态性:
      继承同一个类的多个子类中有相同的方法名
      那么子类产生的对象就可以不用考虑具体的类型而直接调用功能

     3 如何用
     """


      #多态性继承同一个类的多个子类中有相同的方法名
      # 第一个版本:
      """
      class Animal:
       def speek(self):
        pass
       def eat(self):
        pass

      class People(Animal):
       def speak(self):
        print('say hello')
       def eat(self):
        pass

      class Dog(Animal):
       def speak(self):
        print('汪汪汪')

       def eat(self):
        pass

      class Pig(Animal):
       def speak(self):
        print('哼哼哼')

      peo1=People()
      dog1=Dog()
      pig1=Pig()

      peo1.speak()
      dog1.speek()
      pig1.speak()
      """

      #可以限定父类的标准,强制子类必须使用相同的speak方法名
      import abc

      class Animal(metaclass=abc.ABCMeta):
       @abc.abstractmethod
       def speak(self):
        print('animal joiao')
       @abc.abstractmethod
       def eat(self):
        pass


      class People(Animal):
       def speak(self):
        print('say hello')
       def eat(self):
        pass

      class Dog(Animal):
       def speak(self):
        print('汪汪汪')

       def eat(self):
        pass

      class Pig(Animal):
       def speak(self):
        print('哼哼哼')
       def eat(self):
        pass
      """
      # 强调第一点:
      1.Animal() #强制:父类是用来指定标准的,只是规定一个框架格式,不能被实例化
      2.Animal父类中有的方法speak()和 eat子类中也必须要有,名字也必须一致
      3.子类中的必要要有和父类一致的函数体标准

      """
      #
      peo1=People()
      dog1=Dog()
      pig1=Pig()
      #
      peo1.speak()
      dog1.speak()
      pig1.speak()

      #实现的目的就是调用时不用考虑是什么物种,直接定义一个函数秩序传动物进去就行
      def my_speak(animal):
       animal.speak()    #动物.speak() 结果就是个子对应的输出值
      my_speak(peo1)  #只需要传动物进去就行

      # 概念延伸理解:我们之前也一直在用多态的概念
      l=[1,2,3]
      s='hello'
      t=(1,2,3)

      print(l.__len__())
      print(s.__len__())
      print(t.__len__())

      def len(obj):
       return obj.__len__()
      print(len(l))
      print(len(s))
      print(len(t))

  • 相关阅读:
    C# 关键字 default
    nopCommerce_3.00-Nop.Core.Caching
    汉字转拼音
    ASP.NET MVC性能调试工具-MvcMiniProfiler
    开源项目
    UVA 11374 Airport Express 最短路
    UVA 10319 Manhattan 2-sat
    UVA 1357 Cells
    UVA 610 Street Directions 双连通分量
    UVA 11504 Dominos 强连通分量
  • 原文地址:https://www.cnblogs.com/yangzhizong/p/9234216.html
Copyright © 2020-2023  润新知