亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

python設(shè)計(jì)模式-UML類圖中的結(jié)構(gòu)及python實(shí)現(xiàn)

shadajin / 1205人閱讀

摘要:前言最近在看設(shè)計(jì)模式。類抽象類中接口圖示接口在中的圖形為可以看到再其上半部分有一個(gè)的表示。代碼在中本事是沒(méi)有接口和抽象類這一概念的,但是可以通過(guò)這個(gè)庫(kù)來(lái)實(shí)現(xiàn)。在代碼中的結(jié)構(gòu)就是繼承非抽象類。箭頭指向抽象類。

前言

最近在看設(shè)計(jì)模式。在學(xué)習(xí)初期一直有一個(gè)問(wèn)題困擾著我,那就是UML類圖
中的各種結(jié)構(gòu)用python代碼是如何實(shí)現(xiàn)的?這個(gè)在初期可以說(shuō)是深深的困擾著我的設(shè)計(jì)模式
學(xué)習(xí)之路。下面我將介紹一下我自己總結(jié)的實(shí)現(xiàn),如果有錯(cuò)誤也希望各位給指出,不勝感激。

工具介紹

本文的UML圖采用Enterprise Architect繪制。
Python版本2.7.12
(在用了Enterprise Architect 后才知道他有從類圖導(dǎo)出代碼的功能,/捂臉
早知道就用這個(gè)學(xué)習(xí)各種結(jié)構(gòu)的實(shí)現(xiàn)了。文末有介紹如何用Enterprise Architect 導(dǎo)出代碼。)

類圖

類圖是由類和類之間的連接關(guān)系構(gòu)成。
類我們這里只介紹類和抽象類。
連接關(guān)系我們介紹泛化(generalization)、實(shí)現(xiàn)(realize)、聚合(aggregation)、組合(compositon)、關(guān)聯(lián)(assocation)和依賴(dependency)共六種。

抽象類(java中接口) 圖示

接口在UML中的圖形為

可以看到再其上半部分有一個(gè)interface的表示。在接口中一般只給出接口的定義
而實(shí)現(xiàn)一般放在子類和實(shí)現(xiàn)。

代碼

在python中本事是沒(méi)有接口和抽象類這一概念的,但是可以通過(guò)abc(Abstract Base Class)這個(gè)python庫(kù)來(lái)實(shí)現(xiàn)?;蛘呤峭ㄟ^(guò)拋出NotImplementedError這個(gè)異常來(lái)實(shí)現(xiàn)。

通過(guò)abc模塊來(lái)實(shí)現(xiàn)
from abc import ABCMeta, abstractmethod, abstractproperty

class Drawable:
    __metaclass__ = ABCMeta

    @abstractproperty
    def size(self):
        pass

    @abstractmethod
    def draw(self, x, y, scale=1.0):
        pass


class Cicle(Drawable):
    def size(self):
        print "Cicle"

    def draw(self, x, y, scale=1.0):
        print str(x*y*scale)

c = Cicle()

如果在子類里面沒(méi)有實(shí)現(xiàn)方法,當(dāng)實(shí)例化子類的時(shí)候會(huì)報(bào)錯(cuò)。abc模塊的具體使用這里就不介紹了。放上abc的 PEP3119

通過(guò)拋異常來(lái)實(shí)現(xiàn)
class Drawable1:
    def size(self):
        raise NotImplementedError

    def draw(self, x, y, scale=1.0):
        raise NotImplementedError


class Cicle(Drawable):
    def size(self):
        print "Cicle"

    def draw(self, x, y, scale=1.0):
        print str(x*y*scale)

c = Cicle()
c.draw()

這里如果子類沒(méi)有實(shí)現(xiàn)方法,在實(shí)例化的時(shí)候不會(huì)報(bào)錯(cuò)。只有當(dāng)調(diào)用到未實(shí)現(xiàn)的方法時(shí)候才會(huì)報(bào)錯(cuò)。這種通過(guò)abc的注冊(cè)機(jī)制也可以實(shí)現(xiàn)。

圖示

類的圖示如下

可以看到整個(gè)圖形分為三部分:上面為類名,中間為類屬性,下面為類方法。
其中可以看到有- + 和# 三種符號(hào),其分別代表私有、公有、保護(hù)。其中保護(hù)變量在python中是不存在的。
公有變量可以在類外被直接訪問(wèn)。且可以被子類繼承,私有變量只能再此類中被訪問(wèn)且不可以被子類繼承。

代碼
class Flower(object):
    def __init__(self, floral=None, leaf=None):
        self.floral = floral
        self.__leaf = leaf
        
    def flowing(self):
        print "flower"
        
    def __grow(self):
        print "grow grow"

其中以兩條下劃線開頭的變量為私有變量,方法為私有方法。
其實(shí)在python中也不是在類外面無(wú)法訪問(wèn)到私有變量或方法。只是在生成python字節(jié)碼的時(shí)候在編譯器自動(dòng)再含有__ 開頭的屬性或變量前加上了 _{classname}了你可以在類外通過(guò) _Flower__leaf 訪問(wèn)到__leaf屬性,當(dāng)然這并沒(méi)有什么意義。

連接關(guān)系 泛化(generalization) 圖示

首先我們來(lái)看一下泛化關(guān)系的UML結(jié)構(gòu)圖。

連接器的是由一條直線和一個(gè)三角組成的,連接的兩端都是類。在代碼中的結(jié)構(gòu)就是繼承非抽象類。

代碼
class Car(object):
    def __init__(self):
        self.wheel = ["11", "12", "21", "22"]
        self.body = "car body"

    def run(self):
        print self.wheel
        print self.body

    def horn(self):
        print "bbbbbbb"


class SUV(Car):
    def run(self):
        print "suv"
        super(SUV, self).run()


class Jeep(Car):
    def run(self):
        print "jeep"
        super(Jeep, self).run()

jeep = Jeep()
jeep.run()
jeep.horn()

我們可以看到Jeep和SUV繼承了Car這個(gè)非抽象類

實(shí)現(xiàn)(realize) 圖示

從圖中可以看出實(shí)現(xiàn)關(guān)系為一個(gè)三角箭頭加一段虛線構(gòu)成。箭頭指向抽象類。
在代碼中表現(xiàn)為繼承抽象類。

代碼
class Vehicle(object):
    def run(self):
        raise NotImplementedError
    
    
class Car(Vehicle):
    def run(self):
        print "car run run"
        
        
class Bicycle(Vehicle):
    def run(self):
        print "bicycle run run"

代碼中Car和Bicycle繼承了Vehicle這個(gè)抽象類。

關(guān)聯(lián)關(guān)系(assocation)

關(guān)聯(lián)關(guān)系是用一條直線表示的;它描述不同類的對(duì)象之間的結(jié)構(gòu)關(guān)系;它是一種靜態(tài)關(guān)系, 通常與運(yùn)行狀態(tài)無(wú)關(guān),一般由常識(shí)等因素決定的;它一般用來(lái)定義對(duì)象之間靜態(tài)的、天然的結(jié)構(gòu); 所以,關(guān)聯(lián)關(guān)系是一種“強(qiáng)關(guān)聯(lián)”的關(guān)系;
比如,乘車人和車票之間就是一種關(guān)聯(lián)關(guān)系;學(xué)生和學(xué)校就是一種關(guān)聯(lián)關(guān)系;[1]

圖示

關(guān)聯(lián)關(guān)系為一條直線,可以有箭頭,如圖表示car知道Moter的存在而Moter不知道Car的存在。表現(xiàn)在代碼中就是Car中有一個(gè)屬性為Motor類的實(shí)例。也可以為雙箭頭表示互相知道。

代碼
class Motor(object):
    pass

class Car(object):
    def __init__(self):
        self.motor = Motor()
依賴關(guān)系(dependency)

他描述一個(gè)對(duì)象在運(yùn)行期間會(huì)用到另一個(gè)對(duì)象的關(guān)系.與關(guān)聯(lián)關(guān)系不同的是,它是一種臨時(shí)性的關(guān)系,通常在運(yùn)行期間產(chǎn)生,并且隨著運(yùn)行時(shí)的變化; 依賴關(guān)系也可能發(fā)生變化;

顯然,依賴也有方向,雙向依賴是一種非常糟糕的結(jié)構(gòu),我們總是應(yīng)該保持單向依賴,杜絕雙向依賴的產(chǎn)生;
注:在最終代碼中,依賴關(guān)系體現(xiàn)為類構(gòu)造方法及類方法的傳入?yún)?shù),箭頭的指向?yàn)檎{(diào)用關(guān)系;依賴關(guān)系除了臨時(shí)知道對(duì)方外,還是“使用”對(duì)方的方法和屬性;[1]

圖示

從圖中可以看出依賴關(guān)系為在類的方法中將另一個(gè)類當(dāng)作參數(shù)傳入。

代碼
class People(object):
    def cooking(self, wok):
        wok.cook()

class Wok(object):
    def cook(self):
        print "cook"

我們?cè)赑eople的cooking方法中傳入了Wok實(shí)例,調(diào)用其cook方法,完成people的cooking動(dòng)作。

組合關(guān)系(composition)

組合關(guān)系表示整體由部分構(gòu)成,但是當(dāng)整體不存在時(shí)部分也不存在,是一種強(qiáng)依賴關(guān)系。

圖示

從圖中看到組合關(guān)系是由一個(gè)實(shí)心的菱形箭頭表示,菱形箭頭指向整體。 公司由部分組成。當(dāng)公司不存在了,部門也就不存在了。

代碼
class Company(object):
    def __init__(self):
        self.__departments = []

    def build_department(self, department):
        self.__departments.append(department)


class Department(object):
    def __init__(self, name):
        self.name = name


c = Company()
d1 = Department("1")
d2 = Department("2")
c.build_department(d1)
c.build_department(d2)
聚合關(guān)系(aggregation)

聚合關(guān)系表示整體由部分構(gòu)成但是當(dāng)整體不存在的時(shí)候部分也是可以存在的。

圖示

從圖中看到聚合關(guān)系由一個(gè)空心的菱形箭頭表示, 菱形箭頭指向整體。及公司是由人組成的。 當(dāng)公司不存在的時(shí)候人還是可以多帶帶存在的。 組合關(guān)系和聚合關(guān)系由常識(shí)來(lái)區(qū)別的。在實(shí)現(xiàn)上區(qū)別不大。

代碼
class Company(object):
    def __init__(self):
        self.__employees = []
    
    def add_employee(self, people):
        self.__employees.append(people)
        
class People(object):
    pass

c = Company()
p1 = People()
p2 = People()
p3 = People()
c.add_employee(p1)
c.add_employee(p2)
c.add_employee(p3)
如何從Enterprise Architect 導(dǎo)出代碼

有點(diǎn)長(zhǎng)我把這個(gè)再寫一篇,
如何從Enterprise Architect 導(dǎo)出代碼

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/40951.html

相關(guān)文章

  • Python自動(dòng)繪制UML圖、函數(shù)調(diào)用圖(Call Graph)

    摘要:借助,自動(dòng)提取代碼的動(dòng)態(tài)調(diào)用流程圖。繪制類圖安裝是一個(gè)開源圖形可視化軟件。循環(huán)曲線表示遞歸過(guò)程調(diào)用。繪制的常用工具有靜態(tài)調(diào)用圖等。包括模塊之間的調(diào)用流程函數(shù)調(diào)用次數(shù)及耗時(shí)等。 ...

    widuu 評(píng)論0 收藏0
  • Python學(xué)習(xí)之路25-使用一等函數(shù)實(shí)現(xiàn)設(shè)計(jì)模式

    摘要:本篇主要講述中使用函數(shù)來(lái)實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 《流暢的Python》筆記。本篇主要講述Python中使用函數(shù)來(lái)實(shí)現(xiàn)策略模式和命令模式,最后總結(jié)出這種做法背后的思想。 1. 重構(gòu)策略模式 策略模式如果用面向?qū)ο蟮乃枷雭?lái)簡(jiǎn)單解釋的話,其實(shí)就是多態(tài)。父類指向子類,根據(jù)子類對(duì)同一方法的不同重寫,得到不同結(jié)果。 1.1 經(jīng)典的策略模式 下圖是經(jīng)典的策略模式的U...

    econi 評(píng)論0 收藏0
  • Learning PHP —— 設(shè)計(jì)模式 | Chap2:設(shè)計(jì)模式UML

    摘要:設(shè)計(jì)模式設(shè)計(jì)模式基本原則設(shè)計(jì)原則按接口而不是按實(shí)現(xiàn)來(lái)編程按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個(gè)抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一個(gè)具體實(shí)現(xiàn)的實(shí)例。例如父類的一個(gè)改變會(huì)逐級(jí)向下傳遞給子類實(shí)現(xiàn),這可能會(huì)影響子類使用的某個(gè)算法。 設(shè)計(jì)模式 設(shè)計(jì)模式基本原則 設(shè)計(jì)原則 ① : 按接口而不是按實(shí)現(xiàn)來(lái)編程 按接口而不是按實(shí)現(xiàn)編程是指,要將變量設(shè)置為一個(gè)抽象類或接口數(shù)據(jù)類型的實(shí)例,而不是一...

    senntyou 評(píng)論0 收藏0
  • UML StarUml

    摘要:類之間的關(guān)系關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系是類與類之間最常用的一種關(guān)系,它是一種結(jié)構(gòu)化關(guān)系,用于表示一個(gè)類對(duì)象與另一個(gè)類對(duì)象之間有聯(lián)系。自關(guān)聯(lián)在系統(tǒng)中可能會(huì)存在一些類的屬性對(duì)象類型為該類本身,這種特殊的關(guān)聯(lián)關(guān)系稱為自關(guān)聯(lián)。 UML UML:統(tǒng)一建模語(yǔ)言(Unified Modeling Language)。在 UML 系統(tǒng)開發(fā)中有三個(gè)主要的模型: 功能模型:從用戶的角度展示系統(tǒng)的功能,包括用例圖...

    NikoManiac 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<