成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python超細膩研究面向?qū)ο笤O(shè)計

89542767 / 387人閱讀

  面向?qū)ο笤O(shè)計是一類編程方式,此編程方式的落地式需要使用“類”和“目標”來達到,因此,面向?qū)ο笤O(shè)計本身就是對“類”和“目標”的應(yīng)用,今日給大家介紹一下python面向?qū)ο笤O(shè)計開發(fā)設(shè)計及本質(zhì)特征,感興趣的小伙伴一起了解一下吧


  序言


  面向?qū)ο笤O(shè)計對新手而言不難理解但無法運用,盡管我們給大家匯總過面向?qū)ο髴?zhàn)略部署方式(定義類、創(chuàng)建對象、給目標發(fā)信息),可是看似簡單其實不簡單。大量程序編寫訓(xùn)練與閱讀高質(zhì)量的編碼有可能是這一階段最能夠幫到大家的兩件事。下面我們還是用經(jīng)典實例來剖析面向?qū)ο笤O(shè)計的基礎(chǔ)知識,并且也通過這個實例給大家講解怎樣利用以前學(xué)習(xí)過的Python專業(yè)知識。


  撲克牌游戲。


  表明:簡潔明了考慮,我們自己的撲克牌僅有52撲克牌(并沒有兩王),手機游戲需要把52撲克牌發(fā)至4個游戲玩家手里,每個游戲玩家手里有13撲克牌,依照黑桃皇后、桃心、金邊麥冬、格子順序和等級從小到大排列,暫不完成別的的功效。


  應(yīng)用面向?qū)ο笤O(shè)計方式,首先要從難題的需要中尋找目標并抽像出相對應(yīng)的類,除此之外還需要尋找對象的屬性與行為。自然,這件事并不是很艱難,我們要從市場需求的談話中找到動詞和名詞,專有名詞一般便是目標或是對象的屬性,而形容詞一般是對象個人行為。撲克牌游戲中最少應(yīng)當(dāng)有三種目標,各是牌、撲克牌和游戲玩家,牌、撲克牌、游戲玩家3個類并不是獨立的。類及類的關(guān)系能夠粗略地的分為is-a關(guān)系(傳承)、has-a關(guān)系(關(guān)系)和use-a關(guān)系(依靠)。顯然撲克牌胡牌是has-a關(guān)系,因為一副撲克有(has-a)52撲克牌;游戲玩家胡牌中間不但有關(guān)聯(lián)性也有依存關(guān)系,因為游戲玩家手里有(has-a)牌并且游戲玩家用了(use-a)牌。


  牌的特性不言而喻,有顏色和等級。我們可以通過0到3的四個數(shù)字來意味著4種不一樣花色,但這樣的代碼可讀性會很糟糕,只要我們并不了解黑桃皇后、桃心、金邊麥冬、格子跟0到3的數(shù)的相互關(guān)系。當(dāng)一個自變量的選值僅有比較有限好幾個選擇項,大家可以用枚舉類型。與C、Java等語言表達不一樣的是,Python里沒有申明枚舉類型的關(guān)鍵詞,可是能通過傳承enum控制模塊Enum類來建立枚舉類型,編碼具體如下。


  from enum import Enum
  class Suite(Enum):
  """花色(枚舉)"""
  SPADE,HEART,CLUB,DIAMOND=range(4)


  依據(jù)上邊的編碼能夠得知,界定枚舉類型本身就是界定符號常量,如SPADE、HEART等。每個符號常量都是有與其相對應(yīng)的值,談道黑桃皇后就不用再數(shù)據(jù)0,而是以Suite.SPADE;同樣,表明格子可以不數(shù)據(jù)3,而是以Suite.DIAMOND。留意,應(yīng)用符號常量一定是好于應(yīng)用字面上變量定義的,因為能夠了解英語就能明白符號常量的內(nèi)涵,編碼的易讀性會提高許多。Python里的枚舉類型是可迭代種類,簡單來說就是能將枚舉類型放在for-in循環(huán)中,先后取下每個符號常量及其相對應(yīng)的值,具體如下。


  class Card:
  """牌"""
  def __init__(self,suite,face):
  self.suite=suite
  self.face=face
  def __repr__(self):
  suites='????'
  faces=['','A','2','3','4','5','6','7','8','9','10','J','Q','K']
  #根據(jù)牌的花色和點數(shù)取到對應(yīng)的字符
  return f'{suites[self.suite.value]}{faces[self.face]}'


  實施上邊的編碼會在player.arrange()那邊發(fā)現(xiàn)異常,因為Player的arrange方法用了目錄的sort對游戲玩家手里的牌進行篩選,排列必須較為2個Card對象尺寸,而<操作符又無法直接應(yīng)用于Card類型,因此出現(xiàn)了TypeError出現(xiàn)異常,出現(xiàn)異常信息為:'<'notsupportedbetweeninstancesof'Card'and'Card'。


  card1=Card(Suite.SPADE,5)
  card2=Card(Suite.HEART,13)
  print(card1,card2)#?5?K


  為了能解決這些問題,我們能對Card類的編碼稍加改動,促使2個Card目標也可以用<開展大小的小較為。這兒使用技術(shù)性叫函數(shù)重載,Python時要完成對<操作符的輕載,必須在類中加入1個名叫__lt__的魔術(shù)師方式。顯然,魔術(shù)師方式__lt__中的lt是英文單詞“l(fā)essthan”的簡稱,依此類推,魔術(shù)師方式__gt__相匹配>操作符,魔術(shù)師方式__le__相匹配<=操作符,__ge__相匹配>=操作符,__eq__相匹配==操作符,__ne__相匹配!=操作符。


  修訂后的Card類編碼具體如下。


  import random
  class Poker:
  """撲克"""
  def __init__(self):
  #通過列表的生成式語法創(chuàng)建一個裝52張牌的列表
  self.cards=[Card(suite,face)for suite in Suite
  for face in range(1,14)]
  #current屬性表示發(fā)牌的位置
  self.current=0
  def shuffle(self):
  """洗牌"""
  self.current=0
  #通過random模塊的shuffle函數(shù)實現(xiàn)列表的隨機亂序
  random.shuffle(self.cards)
  def deal(self):
  """發(fā)牌"""
  card=self.cards[self.current]
  self.current+=1
  return card
  property
  def has_next(self):
  """還有沒有牌可以發(fā)"""
  return self.current<len(self.cards)


  薪資發(fā)放系統(tǒng)軟件。


  規(guī)定:某企業(yè)有三大類的職工,各是業(yè)務(wù)經(jīng)理、程序猿和銷售人員。必須制作一個薪資發(fā)放系統(tǒng)軟件,依據(jù)所提供的員工檔案進行計算職工的月工資。在其中,業(yè)務(wù)經(jīng)理的月工資是固定不動15000元;程序猿按上班時間(以鐘頭為基準)付款月工資,一小時200元;銷售人員的月工資由1800元基本工資再加上銷售總額5%的抽成兩個部分組成。


  poker=Poker()
  poker.shuffle()
  print(poker.cards)


  依據(jù)對于該市場需求的剖析,能夠得知業(yè)務(wù)經(jīng)理、程序猿、銷售人員全是職工,有共同的特性與行為,那我們可以直接制作一個名叫Employee的成員變量,然后通過傳承的形式從這一成員變量派長出業(yè)務(wù)經(jīng)理、程序猿和銷售人員3個派生類。顯然,后續(xù)編碼不容易建立Employee類對象,只要我們更需要的是實際的職工目標,并且這個類能夠設(shè)計為專門用來傳承的內(nèi)部類。Python里沒有界定內(nèi)部類的關(guān)鍵詞,可是能通過abc控制模塊中名叫ABCMeta的元類來衡量內(nèi)部類。有關(guān)元類專業(yè)知識,后邊的課堂中會有專業(yè)的解讀,這兒無需太過糾結(jié)這一概念,記牢使用方法就可以。


  class Player:
  """玩家"""
  def __init__(self,name):
  self.name=name
  self.cards=[]
  def get_one(self,card):
  """摸牌"""
  self.cards.append(card)
  def arrange(self):
  self.cards.sort()


  在后面的職工類中,有個名叫g(shù)et_salary的方式用以結(jié)款月工資,但由于都還沒斷定什么類型職工,因此結(jié)款月工資雖是職工的公眾個人行為但這卻不能夠完成。針對暫且不能完成的辦法,大家能使用abstractmethod裝飾器把它申明為抽象類,所說抽象類便是僅有申明無法實現(xiàn)的辦法,申明用這種方法是為了給派生類去重新寫過用這種方法。接下來代碼展示了怎樣從職工類派長出業(yè)務(wù)經(jīng)理、程序猿、銷售人員這幾個派生類及其派生類怎樣重新寫過成員變量的抽象類。


  class Manager(Employee):
  """部門經(jīng)理"""
  def get_salary(self):
  return 15000.0
  class Programmer(Employee):
  """程序員"""
  def __init__(self,name,working_hour=0):
  super().__init__(name)
  self.working_hour=working_hour
  def get_salary(self):
  return 200*self.working_hour
  class Salesman(Employee):
  """銷售員"""
  def __init__(self,name,sales=0):
  super().__init__(name)
  self.sales=sales
  def get_salary(self):
  return 1800+self.sales*0.05


  上邊的Manager、Programmer、Salesman3個類都傳承自Employee,3個類都各自重新寫過了get_salary方式。重新寫過便是派生類對成員變量現(xiàn)有的方式再次作出完成。想必大家早已察覺到了,3個派生類中的get_salary不盡相同,因此用這種方法在程序執(zhí)行的時候會造成多態(tài)性個人行為,多態(tài)性簡單來說就是啟用同樣的方式,不同類型的派生類目標做不同類型的事兒。


  poker=Poker()
  poker.shuffle()
  players=[Player('東邪'),Player('西毒'),Player('南帝'),Player('北丐')]
  for _ in range(13):
  for player in players:
  player.get_one(poker.deal())
  for player in players:
  player.arrange()
  print(f'{player.name}:',end='')
  print(player.cards)


  我們可以通過下邊的編碼來實現(xiàn)這一薪資發(fā)放系統(tǒng)軟件,因為程序猿和銷售人員必須各自上傳當(dāng)月工作時間和銷售總額,因此在下邊的編碼中用了Python內(nèi)嵌的isinstance函數(shù)來判斷職工對象種類。我們之前講過的type函數(shù)也能識別對象種類,但是isinstance函數(shù)更加強大,因為它可以判斷出一個目標是不是某個傳承結(jié)構(gòu)下的子類型,你可以簡答的理解為type函數(shù)是對對象類型的精準匹配,而isinstance函數(shù)是對對象類型的模糊匹配。


  from abc import ABCMeta,abstractmethod
  class Employee(metaclass=ABCMeta):
  """員工"""
  def __init__(self,name):
  self.name=name
  abstractmethod
  def get_salary(self):
  """結(jié)算月薪"""
  pass
  總結(jié)
  class Card:
  """牌"""
  def __init__(self,suite,face):
  self.suite=suite
  self.face=face
  def __repr__(self):
  suites='????'
  faces=['','A','2','3','4','5','6','7','8','9','10','J','Q','K']
  #根據(jù)牌的花色和點數(shù)取到對應(yīng)的字符
  return f'{suites[self.suite.value]}{faces[self.face]}'
  def __lt__(self,other):
  #花色相同比較點數(shù)的大小
  if self.suite==other.suite:
  return self.face<other.face
  #花色不同比較花色對應(yīng)的值
  return self.suite.value<other.suite.value


  面向?qū)ο蟮木幊趟枷敕浅5暮茫卜先祟惖恼K季S習(xí)慣,但是要想靈活運用面向?qū)ο缶幊讨械某橄?、封裝、繼承、多態(tài)需要長時間的積累和沉淀,這件事情無法一蹴而就,屬于“路漫漫其修遠兮,吾將上下而求索”的東西。


  上述文章就給大家介紹完畢,希望可以給大家?guī)韼椭?/p>

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/128848.html

相關(guān)文章

  • [零基礎(chǔ)學(xué)python]關(guān)于類的初步認識

    摘要:反對者在某些領(lǐng)域?qū)Υ擞枰苑裾J。下面再引用一段來自維基百科中關(guān)于的歷史。類的更嚴格的定義是由某種特定的元數(shù)據(jù)所組成的內(nèi)聚的包。類還可以有運行時表示形式元對象,它為操作與類相關(guān)的元數(shù)據(jù)提供了運行時支持。 在開始部分,請看官非常非常耐心地閱讀下面幾個枯燥的術(shù)語解釋,本來這不符合本教程的風(fēng)格,但是,請看官諒解,因為列位將來一定要閱讀枯燥的東西的。這些枯燥的屬于解釋,均來自維基百科。 1、問題...

    王巖威 評論0 收藏0
  • 拼多多的搜索的參數(shù)anti_content怎么破

    摘要:這里就可以看到我們需要找的參數(shù)了,但是這里已經(jīng)生成了,我們可以直接查看右邊的調(diào)用棧經(jīng)過多次查看,可以很容易就發(fā)現(xiàn)這個地方有點東西,立即下斷點這時我們可以先去掉斷點,然后刷看查看,獲取不斷點下一個斷點直到運行結(jié)束再滑動到下一頁即可。 今天繼續(xù)帶來破解拼多多的 anti_content 參數(shù)破解,代碼已經(jīng)放在github上:https://github.com/SergioJune...(...

    everfight 評論0 收藏0
  • 拼多多的搜索的參數(shù)anti_content怎么破

    摘要:這里就可以看到我們需要找的參數(shù)了,但是這里已經(jīng)生成了,我們可以直接查看右邊的調(diào)用棧經(jīng)過多次查看,可以很容易就發(fā)現(xiàn)這個地方有點東西,立即下斷點這時我們可以先去掉斷點,然后刷看查看,獲取不斷點下一個斷點直到運行結(jié)束再滑動到下一頁即可。 今天繼續(xù)帶來破解拼多多的 anti_content 參數(shù)破解,代碼已經(jīng)放在github上:https://github.com/SergioJune...(...

    tulayang 評論0 收藏0
  • 學(xué)習(xí)Python:做數(shù)據(jù)科學(xué)還是網(wǎng)站開發(fā)?

    摘要:屬于前一種,而且日益被用于數(shù)學(xué)計算機器學(xué)習(xí)和多種數(shù)據(jù)科學(xué)應(yīng)用。近來,由于擁有多個針對機器學(xué)習(xí)自然語言處理數(shù)據(jù)視覺化數(shù)據(jù)探索數(shù)據(jù)分析和數(shù)據(jù)挖掘的插件,豐富的數(shù)據(jù)科學(xué)生態(tài)體系得到了較大的發(fā)展,甚至有將數(shù)據(jù)科學(xué)社區(qū)化的趨勢。 譯者注:本文的英文原文地址是:Python for Data Science vs Python for Web Development,發(fā)布時間是10月29日。譯者一...

    neu 評論0 收藏0
  • 小型的編程項目有哪些值得推薦?這本神書寫了 22 個,個個了不得

    摘要:電子表格使用語言電子表格是辦公軟件的必備,我們最熟知的是微軟的。文中用框架來實現(xiàn)一個簡單的電子表格,所用代碼僅行。 showImg(https://segmentfault.com/img/remote/1460000019770011); 本文原創(chuàng)并首發(fā)于公眾號【Python貓】,未經(jīng)授權(quán),請勿轉(zhuǎn)載。 原文地址:https://mp.weixin.qq.com/s/Ob... 今天,...

    haitiancoder 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<