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

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

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

  披萨店团队可以通过文件。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 "<Employee: name=%s, salary=%s>" %( 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,因为会在这里继承找到这个方法。

<Employee: name=bob, salary=50000>
bob makes pizza
<Employee: name=bob, salary=60000.0>
--------------------------
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 "<Employee: name=%s, salary=%s>" %( 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 <Employee: name=Pat, salary=40000>
Bob makes pizza
oven bakes
Homer pays for item to <Employee: name=Pat, salary=40000>
...
Shaggy orders from <Employee: name=Pat, salary=40000>
Bob makes pizza
oven bakes
Shaggy pays for item to <Employee: name=Pat, salary=40000>

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

python3--类与继承和组合的更多相关文章

  1. Python3 类和继承和组合

    import random as r class Fish: def __init__(self): self.x = r.randint(0,10) self.y = r.randint(0,10) ...

  2. python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法

    对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(sel ...

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

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

  4. Python3 类的继承

    目录 继承的基本概念 什么是继承 继承有什么用 如何实现继承 初识继承 寻找继承关系 如何寻找继承关系 实例演示 继承背景下的对象属性查找顺序 派生 新式类和经典类 钻石继承 通过继承实现修改json ...

  5. Python3 类的继承小练习

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

  6. Python基础(16)_面向对象程序设计(类、继承、派生、组合、接口)

    一.面向过程程序设计与面向对象程序设计 面向过程的程序设计:核心是过程,过程就解决问题的步骤,基于该思想设计程序就像是在设计一条流水线,是一种机械式的思维方式 优点:复杂的问题的简单化,流程化 缺点: ...

  7. Python3 面向对象-类的继承与派生

    1.什么是继承? 继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类可称为基类或超类,新建的类称为派生类和或子类. 子类会遗传父类的属性,从而解决代码重用问题. ...

  8. Day 18 :面向对象[基础,继承,组合]类的增删改查

    有的人说,编程有3种范式: 1.面向过程:就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. 2.面向函数:面向函数是面向过程的升级版,也就是把每个 ...

  9. python3 入门 (四) 类与继承

    Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...

  10. Inheritance, Association, Aggregation, and Composition 类的继承,关联,聚合和组合的区别

    在C++中,类与类之间的关系大概有四种,分别为继承,关联,聚合,和组合.其中继承我们大家应该都比较熟悉,因为是C++的三大特性继承Inheritance,封装Encapsulation,和多态Poly ...

随机推荐

  1. Hive基础(1)

    Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...

  2. ios 开发发布证书配置详细流程

    iOS证书配置实践 本文参考了: iOS证书配置指南:http://dev.umeng.com/push/ios/license-configuration-guide 写在前面: 团队开发证书的管理 ...

  3. 安装python3后,没有Scripts目录的解决办法

    设置好python环境变量后,执行命令即可:python -m ensurepip

  4. SAP ERP classification和C4C的同步

    在ERP里创建两个characteristic: 创建一个class包这两个characteristic.Class type 002意为该class能用于equipment. replicate到C ...

  5. 《学习CSS布局》学习笔记

    近几天做了一个小的企业展示网站.虽然页面是在模板的基础上改的,但改的多了不熟悉CSS也很麻烦.正好我看到了学习CSS布局这个网站,于是补习了一下CSS知识. CSS的显示 CSS的元素分为两类:块级元 ...

  6. django logging日志优先级

    原创博文 转载请注明出处! 参考官方文档:https://docs.djangoproject.com/en/2.1/topics/logging/ Loggers¶ A logger is the ...

  7. 【思维题 kmp 构造】bzoj4974: [Lydsy1708月赛]字符串大师

    字符串思博题这一块还是有点薄弱啊. Description 一个串T是S的循环节,当且仅当存在正整数k,使得S是T^k(即T重复k次)的前缀,比如abcd是abcdabcdab的循环节 .给定一个长度 ...

  8. 利用sysbench工具测试MHA

    利用sysbench工具测试MHA 1. sysbench准备数据 2. sysbench开始压测 3. master模拟意外宕机 4. mysqldb2 上观察mha状态 5. 手工failover ...

  9. Voyager的数据库操作与Bread Builder,解决国内打开网速超级慢的问题

    Products表的创建: Bread Builder 伟大的XX封了谷哥,所以有关网站实在是打不开,正准备放弃的时候,突然发现问题了,对就是这个网站ajax.googleapis.com,由于调用的 ...

  10. python入门:1-99所有数的和附带等式

    #!/usr/bin/env python # -*- coding:utf-8 -*- #1-99所有数的和的等式 #start(开始,译音:思达二测)sum(合计,译音:桑木)temp(临时雇员, ...