今日内容:
 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. Unity3d通过脚本生成apk

    参考链接:http://www.jianshu.com/p/a9261113b4ac 照着链接的方法并没有正确生成APK,IPA没有测试过,不过大致的方法是正确的,修改如下: Environment. ...

  2. npm使用快速的安装源(nrm)

    安装 npm install nrm --global 使用 nrm ls 切换安装源 nrm use taobao 测速 nrm test npm 参考地址:http://codingdict.co ...

  3. SharePoint 2013 安装配置(3-2)

    第三部分SQL Server后端配置篇幅较长,上一篇介绍SQL Server 前提条件及安装(3-1),这篇分享SQL Server功能安装配置,请参考以下步骤. 10.在“安装角色”屏幕上,选择“S ...

  4. Selenium3+webdriver学习笔记3(xpath方式元素定位)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriver import time,os # about:ad ...

  5. LINQ 基础语句

    去全部集合 using (dat0216DataContext con = new dat0216DataContext()) { //LoList   是转换成  List集合 List<Us ...

  6. 记录下关于SQL server1433端口监听不了的问题

    CMD命令netstat -an |findstr 1433,即使在防火墙的入站规则里添加了1433端口的访问,发现1433的端口还是监听不了. 搞了老半天,最终调整了MSSQESERVER的协议下的 ...

  7. CentOS6.4安装JDK,卸载自带的OpenJDK

    1.查看OpenJDK的安装包 $ rpm -qa |grep java java-1.6.0-openjdk-1.6.0.0-1.62.1.11.11.90.el6_4.x86_64 java-1. ...

  8. HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(巴什博弈)

    思路:若能给对方留下m+1,就可以胜.否则败. #include <iostream> using namespace std; int main() { int t,n,m;cin> ...

  9. OpenLayers 3 的 图层控制控件

    openlayers3的control中没有提供默认的图层控制控件. 但是git上已经有造好的轮子,直接拿来用就可以了.地址 https://github.com/walkermatt/ol3-lay ...

  10. UVA11478 Halum (差分约束)

    每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui). 最后就是要确定所有的x(u). 因为m越大,满足条件的边就越少,二分答案m. 对于一条边 ...