2017-06-21 125 views
0

我一直在閱讀關於蟒蛇組成,在這裏下面就stackoverlow我覺得有些文章和答案後,一個現實的用法,我能夠得到什麼它是和如何是實現。但有一個問題,我無法找到答案是爲什麼組成? (不比繼承的好處)。這裏要說的是,我從here得到了一個例子:的組成蟒蛇

class Salary: 
    def __init__(self,pay): 
     self.pay=pay 

    def get_total(self): 
     return (self.pay*12) 

class Employee: 
    def __init__(self,pay,bonus): 
     self.pay=pay 
     self.bonus=bonus 
     self.obj_salary=Salary(self.pay) 

    def annual_salary(self): 
     return "Total: " + str(self.obj_salary.get_total()+self.bonus) 


obj_emp=Employee(100,10) 
print (obj_emp.annual_salary()) 

我想有一點現實的例子來理解它會被分隔條件兩個相關類受益

+0

'薪水'可以分類 - *工資*,* tredicesima *等。而一個'員工'類型可能*組成*任何子類。 –

+0

@MosesKoledoye不能直接使用'pay'作爲'Employee'類的'object屬性'嗎? – anekix

+1

這將您限制爲數字值。通過「薪資」類別,您可以跟蹤與員工薪酬相關的其他相關屬性。 –

回答

2

使用(和究竟什麼好處?)你的榜樣

class Salary: 
    def __init__(self,pay): 
     self.pay=pay 

    def get_total(self): 
     return (self.pay*12) 

    def increase(self): 
     self.pay *= 1.1 


class Employee: 
    def __init__(self,pay,bonus): 
     self.pay=pay 
     self.bonus=bonus 
     self.obj_salary=Salary(self.pay) 

    def annual_salary(self): 
     return "Total: " + str(self.obj_salary.get_total()+self.bonus) 


obj_emp=Employee(100,10) 
print (obj_emp.annual_salary()) 

調用employee.salary.increase的擴展版本使得比更有意義employee.increase

另外如果你需要多個對象呢?你會繼承其中的一個還是所有這些都會導致名稱衝突?

class Game: 
    def __init__(self): 
     self.screens  = [LoadingScreen, MapScreen]   
     self.player  = Player() 
     self.display  = Display() 
     self.stats   = Stats(self.display) 
     self.screenIndex = self.player.getScreen() 
     self.currentScreen = self.screens[self.screenIndex]() 
     self.run() 

*編輯*看着這個

but on looking it up again i find that increase could be renamed to increaseSalary so employee.increaseSalary() would make sense right? 

你可以簡單地移動增加僱員類,但如果你有一個Manager類,或者您需要一個老大級是什麼重複相同的碼用於每個類別

class Employee: 
    def __init__(self,pay,bonus): 
     self.pay=pay 
     self.bonus=bonus 

    def annual_salary(self): 
     return "Total: " + str(self.obj_salary.get_total()+self.bonus) 

    def increase_salary(self): 
     self.pay *= 1.1 


class Manager: 
    def __init__(self,pay,bonus): 
     self.pay=pay 
     self.bonus=bonus 

    def annual_salary(self): 
     return "Total: " + str(self.obj_salary.get_total()+self.bonus) 

    def increase_salary(self): 
     self.pay *= 1.1 

class Boss: 
    def __init__(self,pay,bonus): 
     self.pay=pay 
     self.bonus=bonus 

    def annual_salary(self): 
     return "Total: " + str(self.obj_salary.get_total()+self.bonus) 

    def increase_salary(self): 
     self.pay *= 1.1 

OR只有一次

class Salary: 
    def __init__(self,pay): 
     self.pay=pay 

    def get_total(self): 
     return (self.pay*12) 

    def increase(self, addition): 
     self.pay *= addition 

你也可以使用一個類的方法來找到平均值,最大值,最小值等方便很多

+0

@JoshuaNixoxn謝謝'employee.salary.increase'更有意義,同時使用多個對象對我來說是令人大開眼界的:) – anekix

+0

但是再次查看我發現'increase'可以重命名爲'increaseSalary' 'employee.increaseSalary()'會說得通嗎? – anekix

+0

我將編輯我的答案 –

0

然後我就試試看,即使我是怎樣的一個小白。也可能有一些點我錯過了,但這是我想要的方式,任何人,回答:

因爲它給你很多靈活性,並允許你'組成'對象在一起可能不一定有父/子關係(在傳統的OOP中被稱爲IS-A類型繼承)

例如說你有一個rifle類。你想添加(或撰寫)attachments到它上面。

你會如何做到這一點與繼承?它不會很靈活。

,所以你可以做的是定義你的附件,有自己的班,說sightmuzzle break類,然後聲明這些附件類作爲字段的情況下,在你的rifle類和BAM您現在可以訪問定義的方法在sightmuzzle break中,就像使用繼承時子類可以訪問其超類方法一樣。

仍要繼續,你從這個例子可以看到這將是多麼容易,現在創建各種武器類的,像howitzer,如果處理得當,你可以在howitzer申報sightmuzzle break實例。

注意到我們創建的關係層次結構是完全平坦的。

要做所有這些與繼承,您將定義一個基類,如weaponsightmuzzle break定義相同的方法。然後您會製作分支爲riflehowitzer的子類。

現在想象你不想rifle有一個sightscope。你必須通過你的基礎班的所有這些籃球和詭計來實現這一點。

很好地組成你只是簡單地創建一個新的類scope(這實際上可以從sight繼承),從rifle去除sight的情況下,插入的scope一個字段實例。請注意,howitzer未做任何更改。

與所有這些說我仍然認爲繼承是一個有用的工具,可以在適當的情況下被利用,就像組成。

+0

很好的例子 –

+0

@ mad.meesh非常感謝這個例子 – anekix