类和继承:“是一个”关系

我们已经深入探索了继承的机制,这里举个例子来说明它是如何用于模拟真实世界的关系的。从程序员的角度来看,继承是由属性点号运算启动的,由此触发实例、类以及任何超类中的变最名搜索。从设计师的角度来看,继承是一种定义集合成员关系的方式:类定义了一组内容属性,可由更具体的集合(子类)继承和定制。

为了说明,再看前面提到过的制作披萨的机器人的例子。假设我们决定探索另一条路径,开一家披萨餐厅。我们需要做的其中一件事就是聘请员工为顾客服务,准备食物等等。工程师是核心,我们决定创造一个机器人制作披萨,但是,为了让行政和网络关系正确,我们也决定把机器人做成有薪水的功能齐全的员工。

披萨店团队可以通过文件。mploy。。,.Py中的四个类来定义.最通用的类Employee提供共同行为,例如,加薪(giveRaise)和打印(__repr__).员工有两种,所以Employee有两个子类:Chef和Server。这两个都会覆盖继承的树。rk方法来打印更具体的信息。最后,我们的披萨机器人是由更具体的类来模拟:pizzaRobot是一种chef,也是一种Emp1oyee。以OOP术语来看,我们称这些关系为“是一个”(is一a)链接:机器人是一个主厨,而主厨是一个员工。以下是emPloyoes.Py文件。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

class Employee:

def __init__(self, name, salary=0):

self.name = name

self.salary = salary

def giveRise(self, percent):

self.salary = self.salary + (self.salary * percent)

def work(self):

print(self.name, "does stuff")

def __repr__(self):

return "" %( self.name, self.salary)

class Chef(Employee):

def __init__(self, name):

Employee.__init__(self, name, 50000)

def work(self):

print(self.name, "makes food")

class Server(Employee):

def __init__(self, name):

Employee.__init__(self, name, 40000)

def work(self):

print(self.name, "interfaces with custumer")

class PizzRoboot(Chef):

def __init__(self, name):

Chef.__init__(self, name)

def work(self):

print(self.name, "makes pizza")

if __name__ == "__main__":

bob = PizzRoboot("bob")

print(bob)

bob.work()

bob.giveRise(0.20)

print(bob)

print("--------------------------")

for klass in Employee, Chef, Server, PizzRoboot:

obj = klass(klass.__name__)

obj.work()

当我们执行此模块中的自我测试代码时,会创建一个名为bob的制作披萨机器人,从三个类继承变量名:pizzaRobot、chef以及Employee。例如,打印匕ob会执行Employee.__repr__方法,而给与bob加薪,则会运行Eoployee.giveRaise,因为会在这里继承找到这个方法。

bob makes pizza

--------------------------

Employee does stuff

Chef makes food

Server interfaces with custumer

PizzRoboot makes pizza

当我们执行此模块中的自我测试代码时,会创建一个名为bob的制作披萨机器人,从三个类继承变量名:pizzaRobot、chef以及Employee。例如,打印bob会执行Employee.__repr__方法,而给与bob加薪,则会运行Employee.giveRaise,因为会在这里继承找到这个方法。

类和组合:“有一个”关系

组合的概念.从程序员的角度来看,组合涉及到把其他对象嵌入到容器对象内,并使其实现容器方法。对设计师来说,组合是另一种表示问题领域中的关系的方式。但是,组合不是集合的成员关系,而是组件,也就是整体的组成部分。

组合也反应了各组成部分之间的关系,通常称为‘有一个”(has一a)关系。有些OOP设计书籍把组合称为聚合(aggregation),或者使用聚合指称容器和所含的物之间较弱的依赖关系,来区分这两个术语。本书中,“组合”就是指内嵌对象集合体。组合类一般都提供自己的接口,并通过内嵌的对象来实现接口。

现在,我们已经有了员工,把他们放到披萨店,开始忙吧。我们的披萨店是一个组合对象,有个烤炉,也有服务生和主厨这些员工。当顾客来店下单时,店里的组件就会开始行动:服务生接下订单,主厨制作披萨等等。下面的例子(文件pizzashop.py)模拟了这个场景中所有的对象和关系。

#!/usr/bin/env python

# -*- coding:utf-8 -*-

class Employee:

def __init__(self, name, salary=0):

self.name = name

self.salary = salary

def giveRise(self, percent):

self.salary = self.salary + (self.salary * percent)

def work(self):

print(self.name, "does stuff")

def __repr__(self):

return "" %( self.name, self.salary)

class Chef(Employee):

def __init__(self, name):

Employee.__init__(self, name, 50000)

def work(self):

print(self.name, "makes food")

class Server(Employee):

def __init__(self, name):

Employee.__init__(self, name, 40000)

def work(self):

print(self.name, "interfaces with custumer")

class PizzRoboot(Chef):

def __init__(self, name):

Chef.__init__(self, name)

def work(self):

print(self.name, "makes pizza")

class Customer:

def __init__(self, name):

self.name = name

def order(self, server):

print(self.name, "orders from", server)

def pay(self, server):

print(self.name, "pays for item to", server)

class Oven:

def bake(self):

print("oven bakes")

class PizzaShop:

def __init__(self):

self.server = Server("Pat")

self.chef = PizzRoboot("Bob")

self.oven = Oven()

def order(self, name):

customer = Customer(name)

customer.order(self.server)

self.chef.work()

self.oven.bake()

customer.pay(self.server)

if __name__ == "__main__":

scene = PizzaShop()

scene.order("Homer")

print("...")

scene.order("Shaggy")

pizzashop类是容器和控制器,其构造器会创建上一节所编写的员工类实例并将其嵌入.此外,。ven类也是在这里定义的。当此模块的自我测试程序代码调用pozzashoporder方法时,内嵌对象会按照顺序进行工作.注意:每份订单创建了新的Customer对象,而且把内嵌的server对象传给Customer方法。顾客是流动的,但是,服务生是披萨店的组合成分。另外,员工也涉及了继承关系,组合和继承是互补的工具。当执行这个模块时,我们的披萨店处理了两份订单:一份来自Homer,另一份来自Shaggy。

Homer orders from

Bob makes pizza

oven bakes

Homer pays for item to

...

Shaggy orders from

Bob makes pizza

oven bakes

Shaggy pays for item to

同样地,这只是一个用来模拟的例子,但是,对象和交互足以代表组合的工作.其简明的原则就是,类可以表示任何用一句话表达的对象和关系。只要用类取代名词,用方法取代动词,就有第一手的设计方案了。

python 类继承和组合_python3--类与继承和组合相关推荐

  1. python类为什么要初始化_python3类对象需要在init中初始化吗?

    我们都知道类需要借助类对象才能使用,类对象的作用是不可缺少的.那么,在我们使用类对象的时候需要注意哪些细节呢?比如,有的小伙伴想知道init中需要初始化吗?这个问题不知道大家都考虑了没有,小编已经查阅 ...

  2. python3类的继承详解_python3中类的继承以及self和super的区别详解

    python中类的继承: 子类继承父类,及子类拥有了父类的 属性 和 方法. python中类的初始化都是__init__().所以父类和子类的初始化方式都是__init__(),但是如果子类初始化时 ...

  3. python面向对象实例王者荣耀_Python3 类与对象之王者荣耀对战小游戏

    王者荣耀对战小游戏 # 定义英雄: 亚瑟 class Arthur: hero_type = 'Tank' def __init__(self, attack_value=164, armor=98, ...

  4. python中组合与继承的区别_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  5. Python零基础速成班-第9讲-Python面向对象编程(上),对象和类、初始化、继承、重写、多态、类方法、组合

    Python零基础速成班-第9讲-Python面向对象编程(上),对象和类.初始化.继承.重写.多态.类方法.组合 学习目标 修饰器 面向对象编程:对象和类.初始化.继承.重写.多态.类方法.组合 课 ...

  6. python定义学生类和教师类_Python3 类的继承小练习

    1.打印并解释结果 class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Pa ...

  7. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...

    昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...

  8. python的类和对象例题_Python类、类对象和实例对象、组合、绑定详细讲解

    目录: 一.组合 二.类.类对象和实例对象 三.到底什么是绑定 四.课时39课后习题及答案 *********** 一.组合 *********** 现在要求定义一个类,叫水池,水池里要有乌龟和鱼. ...

  9. Python类与对象最全总结大全(类、实例、属性方法、继承、派生、多态、内建函数)

    目录 面向对象编程 常用术语/名词解释 抽象/实现 封装/接口 合成 派生/继承/继承结构 泛化/特化 多态 自省/反射 访问限制 私有属性和公有属性 私有方法的设置 类 创建类 声明与定义 类属性 ...

  10. python新式类和经典类区别_Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

最新文章

  1. R.drawable 转 bitmap
  2. 研究人员开发出全3D打印离子动力纳米卫星推进器
  3. torch.flatten()函数
  4. 【bzoj3033】太鼓达人 DFS欧拉图
  5. 一起Polyfill系列:Function.prototype.bind的四个阶段
  6. 前端学习(168)全局事件属性
  7. 2020年最好用的手机是哪一款_2020年10款最好用的健康秤
  8. canvas 将图形设置为button_你会将Word设置为默认格式吗?应用之后,效率加倍
  9. for 循环 and while 循环(四)
  10. NOIP 2014 无线网络发射器选址
  11. java反射机制(4)动态代理初探
  12. iWebOffice一些相关
  13. java aspose 导出word_使用Aspose.word导出word报告
  14. Ubuntu删除U盘分区,并格式化U盘
  15. 商汤科技Java面试题(含答案)
  16. OpenCV4学习笔记(57)——基于GrabCut图像分割算法实现背景替换与背景虚化效果
  17. [木野狐]ViewState 剖析(翻译兼笔记)
  18. 汤姆熊游艺厅抓娃娃技巧汇总
  19. 【工业互联网】周剑:工业互联网平台作用机理和发展路径
  20. 苹果cmsv10首涂第二十五套精简宽屏大气带后台简约模板

热门文章

  1. 【BZOJ-4245】OR-XOR 按位贪心
  2. uva111346Probability
  3. JVM插码之三:javaagent介绍及javassist介绍
  4. Path和ClassPath差异
  5. 2014编程之美热身赛 - 传话游戏
  6. 在Netbeans下配置Tomcat manager用户名与密码
  7. 电话开启和电话关闭的命令
  8. oracle 保留一个记录吗,笔记:Oracle查询重复数据并删除,只保留一条记录
  9. mysql的FIQ怎么安装_MySQL数据库设计总结
  10. Linux文件系统保存在哪里,文件系统保存在磁盘的()