今日内容:
 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))

Python面向对象(组合、菱形继承、多态)的更多相关文章

  1. Day 23 类的继承,派生,组合,菱形继承,多态与多态性

    类的继承 继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类 继承的特性是:子类会遗传父类的属性 继承是类与类之间的关系 为什么用继承 使用继承可以减少代码的冗余 对象的继承 python中 ...

  2. Python面向对象,析构继承多态

    析构: def __del__(self): print("del..run...") r1 = Role("xx") del r1 结果打印del..run. ...

  3. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  4. Python面向对象三要素-继承(Inheritance)

    Python面向对象三要素-继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承概述 1>.基本概念 前面我们学习了Python的面向对象三 ...

  5. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  6. python 面向对象三大特性(封装 多态 继承)

    今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...

  7. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

  8. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

  9. Python设计模式 - 基础 - 封装 & 继承 & 多态

    面向对象的核心是对象,世间万物都可以看作对象,任何一个对象都可以通过一系列属性和行为来描述,可以包含任意数量和类型的数据或操作.类是用来描述具有相同属性和方法的所有对象的集合.类通常是抽象化的概念,而 ...

  10. python oop常用术语 继承 多态 封装

    面向对象优点 1.通过封装明确了内外 2.通过继承+多态在语言层面支持了归一化设计 抽象/实现 抽象指对现实世界问题和实体的本质表现,行为和特征建模,建立一个相关的子集,可以用于 绘程序结构,从而实现 ...

随机推荐

  1. layout_weight属性

    layout_weight 某个控件text多行,第一行对齐,baselineAligned = "false" 可使控件对齐 weight 计算规则 剩余尺寸=父布局尺寸-子布局 ...

  2. LeetCode:103Binary Tree Zigzag Level Order Traversal

    真是不容易啊,做这道题的时候脑子一团乱,感觉还是得劳逸结合啊.这道题的思想不难,就是宽搜BFS.通过设置一个flag来判断是否需要逆序输出. 我的做法虽然AC,但是觉得代码还是不好,空间占用较多. / ...

  3. 想系统化快速学习人工智能?上Azure School就够了!

    要说目前最热门的技术,非人工智能莫属了,让计算机程序能够看懂.听懂.读懂.理解我们的世界!想想就激动!! 上至高大上的个人数字化助理,下至P图软件,各种应用都开始增加AI相关的功能,试问又有哪个技术爱 ...

  4. SQL Server数据库所有表重建索引

    USE My_Database;DECLARE @name varchar(100) DECLARE authors_cursor CURSOR FOR  Select [name]   from s ...

  5. db2疑难解决

    http://www-01.ibm.com/support/knowledgecenter/?lang=zh#!/SSEPGG_9.5.0/com.ibm.db2.luw.messages.sql.d ...

  6. 【UML】对象图Object diagram(转)

    http://blog.csdn.net/sds15732622190/article/details/48894751 前言 今天要说的是UML中的对象图.他与类图,合作图都有关系,是类图的实例化. ...

  7. 【转】iOS-生成Bundle包-引入bundle-使用bundle

    在我们使用第三方框架时,常常看到XXX.bundle的文件. 我们找到该文件,显示包内容,大致看到很多资源文件:图片.配置文本.XIB文件……   什么是Bundle文件? 简单理解,就是资源文件包. ...

  8. Dapper学习总结

    看了<Dapper从入门到精通>后的总结 (1)Dapper 是直接扩展 IDBConnection,而且是单独一个文件,可以直接嵌入到项目中使用. (2)通过手写sql语句,调用exec ...

  9. ssh整合思想 Spring分模块开发 crud参数传递 解决HTTP Status 500 - Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or(增加事务)

    在Spring核心配置文件中没有增加事务方法,导致以上问题 Action类UserAction package com.swift.action; import com.opensymphony.xw ...

  10. Java动画 重力弹球 如鹏游戏引擎 精灵 设计一个小球加速落地又减速弹起并反复直到停止的Java程序

    package com.swift; import com.rupeng.game.GameCore; public class BouncingBall implements Runnable { ...