python 类继承和组合_python3--类与继承和组合
類和繼承:“是一個”關(guān)系
我們已經(jīng)深入探索了繼承的機(jī)制,這里舉個例子來說明它是如何用于模擬真實(shí)世界的關(guān)系的。從程序員的角度來看,繼承是由屬性點(diǎn)號運(yùn)算啟動的,由此觸發(fā)實(shí)例、類以及任何超類中的變最名搜索。從設(shè)計(jì)師的角度來看,繼承是一種定義集合成員關(guān)系的方式:類定義了一組內(nèi)容屬性,可由更具體的集合(子類)繼承和定制。
為了說明,再看前面提到過的制作披薩的機(jī)器人的例子。假設(shè)我們決定探索另一條路徑,開一家披薩餐廳。我們需要做的其中一件事就是聘請員工為顧客服務(wù),準(zhǔn)備食物等等。工程師是核心,我們決定創(chuàng)造一個機(jī)器人制作披薩,但是,為了讓行政和網(wǎng)絡(luò)關(guān)系正確,我們也決定把機(jī)器人做成有薪水的功能齊全的員工。
披薩店團(tuán)隊(duì)可以通過文件。mploy。。,.Py中的四個類來定義.最通用的類Employee提供共同行為,例如,加薪(giveRaise)和打印(__repr__).員工有兩種,所以Employee有兩個子類:Chef和Server。這兩個都會覆蓋繼承的樹。rk方法來打印更具體的信息。最后,我們的披薩機(jī)器人是由更具體的類來模擬:pizzaRobot是一種chef,也是一種Emp1oyee。以O(shè)OP術(shù)語來看,我們稱這些關(guān)系為“是一個”(is一a)鏈接:機(jī)器人是一個主廚,而主廚是一個員工。以下是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()
當(dāng)我們執(zhí)行此模塊中的自我測試代碼時,會創(chuàng)建一個名為bob的制作披薩機(jī)器人,從三個類繼承變量名:pizzaRobot、chef以及Employee。例如,打印匕ob會執(zhí)行Employee.__repr__方法,而給與bob加薪,則會運(yùn)行Eoployee.giveRaise,因?yàn)闀谶@里繼承找到這個方法。
bob makes pizza
--------------------------
Employee does stuff
Chef makes food
Server interfaces with custumer
PizzRoboot makes pizza
當(dāng)我們執(zhí)行此模塊中的自我測試代碼時,會創(chuàng)建一個名為bob的制作披薩機(jī)器人,從三個類繼承變量名:pizzaRobot、chef以及Employee。例如,打印bob會執(zhí)行Employee.__repr__方法,而給與bob加薪,則會運(yùn)行Employee.giveRaise,因?yàn)闀谶@里繼承找到這個方法。
類和組合:“有一個”關(guān)系
組合的概念.從程序員的角度來看,組合涉及到把其他對象嵌入到容器對象內(nèi),并使其實(shí)現(xiàn)容器方法。對設(shè)計(jì)師來說,組合是另一種表示問題領(lǐng)域中的關(guān)系的方式。但是,組合不是集合的成員關(guān)系,而是組件,也就是整體的組成部分。
組合也反應(yīng)了各組成部分之間的關(guān)系,通常稱為‘有一個”(has一a)關(guān)系。有些OOP設(shè)計(jì)書籍把組合稱為聚合(aggregation),或者使用聚合指稱容器和所含的物之間較弱的依賴關(guān)系,來區(qū)分這兩個術(shù)語。本書中,“組合”就是指內(nèi)嵌對象集合體。組合類一般都提供自己的接口,并通過內(nèi)嵌的對象來實(shí)現(xiàn)接口。
現(xiàn)在,我們已經(jīng)有了員工,把他們放到披薩店,開始忙吧。我們的披薩店是一個組合對象,有個烤爐,也有服務(wù)生和主廚這些員工。當(dāng)顧客來店下單時,店里的組件就會開始行動:服務(wù)生接下訂單,主廚制作披薩等等。下面的例子(文件pizzashop.py)模擬了這個場景中所有的對象和關(guān)系。
#!/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類是容器和控制器,其構(gòu)造器會創(chuàng)建上一節(jié)所編寫的員工類實(shí)例并將其嵌入.此外,。ven類也是在這里定義的。當(dāng)此模塊的自我測試程序代碼調(diào)用pozzashoporder方法時,內(nèi)嵌對象會按照順序進(jìn)行工作.注意:每份訂單創(chuàng)建了新的Customer對象,而且把內(nèi)嵌的server對象傳給Customer方法。顧客是流動的,但是,服務(wù)生是披薩店的組合成分。另外,員工也涉及了繼承關(guān)系,組合和繼承是互補(bǔ)的工具。當(dāng)執(zhí)行這個模塊時,我們的披薩店處理了兩份訂單:一份來自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
同樣地,這只是一個用來模擬的例子,但是,對象和交互足以代表組合的工作.其簡明的原則就是,類可以表示任何用一句話表達(dá)的對象和關(guān)系。只要用類取代名詞,用方法取代動詞,就有第一手的設(shè)計(jì)方案了。
總結(jié)
以上是生活随笔為你收集整理的python 类继承和组合_python3--类与继承和组合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬取百度贴吧xpath_爬虫
- 下一篇: python的dll文件在哪_Pytho