python中扑克牌类设计_Python类的基础设计、使用
類是事物功能和屬性的抽象,對象是類的實例化。就像人人都知道小汽車可以干什么什么的,但光想小汽車如何好是沒有用的,得開車或坐才能感受到小汽車的好。人腦里的小汽車是抽象的,即類,而坐上的某輛車是小汽車的實例化,即對象。所以,如果一門語言提供了、支持面向對象編程的機制,那么首先得先設計程序所需要的類,然后再在程序里將這些類實例化產生對象,通過對象這個程序元素(和變量、函數等起著相同的作用,構成程序的基本元素),所以類的設計是面向對象編程是否有效、合理、成功的關鍵。
類
類總的來說是專有數據用專用方法處理,即數據和處理數據方法的集合,故類的里有數據(屬性)和函數(功能),且類里的數據必須用類里的方法來操作處理。
類里的這些函數也有時又稱方法、成員函數,如果方法或函數作用于類本身稱之為類方法,如果方法作用于由類產生出的實例對象上,這些方法稱之為實例對象的方法。類里的數據稱為屬性(類屬性和實例對象屬性)、成員變量。
類不能無源而生,需有自己的父類,而object這個類是Python下的根類(base class),也就是說用戶自己的類可以繼承object 這個類作為自己(父)類的起點,類的父類需要用圓括號括起來放在類名字的后邊。
定義類
基于上邊講述,定義一個常規的類格式如下:
class?類名字(父類序列):????類的成員變量?=?初值
????def?__init__(self,?形參序列):
????????self.實例對象的成員變量名?=?初值
????????其他語句
????def?其他實例對象函數名(self,形參序列):
????????語句
????@classmethond
????def?類的成員函數名(cls,形參序列):
????????cls.類的成員變量名?=?初值
????????語句
????@staticmethond
????def?函數名(形參序列):
????????語句
類的語法格式里出現了一些奇奇怪怪的符號,下面一一解釋一下。class和定義函數的def一樣是Python里的關鍵字,用于定義一個類的標識符。
位于class下和_ _init_ _函數間聲明的變量是類的變量,可被類或類的對象共有。
__init__可以成為類的實例對象的構造函數,每次通過類創建一個該類的對象是調用此函數,所以其下的以sefl.前綴的變量是每個創建好了的實例(化)對象的所獨有的。換句話說,有多少個類的對象內存里就有多少份這個實例對象變量存在。就像生產了多少小汽車就有多少個方向盤似的。
self代表運行時的類的實例對象本身,一般在類的內部設計時出現,在程序里使用對象編程時不用self。在實例對象的成員函數里以self.前綴的變量是實例對象的成員變量,沒有self.的變量是本方法函數的局部變量。
cls和self出現在構造和實例對象函數的第一個參數位置上一樣,cls關鍵字出現在類的方法函數里,區分于對象函數和變量時會用到。在類的函數里以cls.前綴的變量也是類的成員變量,沒有這個前綴的是局部變量。
@classmethon這個關鍵字是修飾器,修飾也是說下面的函數是類的方法函數而不是類的對象的方法函數。
@staticmethod這個也是修飾器,說明接下來的函數是一個靜態函數,和實例對象的成員函數、類函數的區別主要在第一個形參,既無self又無cls。可以被類或對象直接調用。差不多解釋完了,下面來看一個具體的類的實例程序。
定義一個類的示例
下面創建一個Horse類,類里除了有實例對象的方法函數、類方法函數和靜態方法函數,還有實例對象成員變量和類變量。
#?coding:utf-8class?Horse(object):
????variety?=?"大宛馬"
????def?__init__(self,?name?=?"green",?height?=?0.5,?length?=?1.3,?sex?=?"male"):???
????????self.name?=?name
????????self.height?=?height
????????self.length?=?length
????????self.sex?=?sex
????????print?"A?baby?horse?is?born?called",?self.name
????@classmethod
????def?pp(cls):
????????print?cls.variety,?Horse.variety,?cls.address
????@classmethod
????def?print_variety(cls):
????????cls.address?=?"xi'an"
????????print?cls.variety,?Horse.variety,?cls.address
????????Horse.pp()
????def?print_info(self):
????????print?self.name,?self.height,?self.length,?self.sex,?Horse.variety#,Horse.address
????????Horse.print_variety()
????@staticmethod
????def?print_ci(x,?y):
????????print?x,?y
1).出現在class下一行的variety是類Horse的變量,是類變量,可以通過Horse.variety在類的內部或者外部任何地方被訪問。
2).__init__函數是Horse類的實例對象的構造函數,每次創建一個Horse類的實例對象時,這個函數均會被調用執行,其下以self.開始的變量是每個實例對象的成員變量,即標的這個實例對象的屬性、特征用的。
3). 用修飾器@classmethod修飾的兩個函數pp、print_variety,是類Horse的類函數,類函數只可通過類或cls使用。在pp這個函數里可以看出一點,在類的內部類變量的使用需前綴類名.或cls.。
類名.類變量cls.類變量
從print_variety函數可以看出,在類的內部可以通過類調用類的方法函數。
類名.類方法4).用@staticmethod修飾的print_ci函數是靜態函數,它的第一個參數不是特殊的self或者cls,靜態函數可在類內部或類的外部調用,也可被類的對象調用。
創建對象
面向對象編程實際是在設計好類以后,用與類同名的函數來創建類的對象,用類的對象調用對象的方法函數來編寫整個程序,有時可能根據需要少量地用類調用類方法的語句代碼出現,一般都是對象調用類里設計好的對象方法函數來完成整個程序的功能,故稱面向對象編程。
創建類的實例對象的語法:
變量?=?類名([參數序列])通過這樣的方式創建類的實例對象本質是調用了類里的_ _ init_ ()方法函數,括號里的[參數序列]意思是看 _ init_ _()方法函數是否有除self外的其他形參,如無,換括號里沒有任何實參。
需要特別說明的是任何實例對象的self形參不用賦值,在Python解譯執行程序語句時self代表點兒運算符(.)前的實例對象,或者說self被Python賦值為點兒運算符前的實例對象。
a?=?Horse(sex?=?"male")b?=?Horse(name?=?"marong",?sex?=?"female")
面向對象編程示例
面向對象編程,需要兩步,第一步先設計好類,第二步基于類創建對象并通過對象調用函數來完成整個程序需要實現的功能。下面是本節課設計的一個Horse類的面向對象程序設計的完整示例。
#?coding:utf-8class?Horse(object):
????variety?=?"大宛馬"
????def?__init__(self,?name?=?"green",?height?=?0.5,?length?=?1.3,?sex?=?"male"):???????
????????#?self.name是成員變量,name是形參、局部變量
????????self.name?=?name
????????self.height?=?height
????????self.length?=?length
????????self.sex?=?sex
????????print?"A?baby?horse?is?born?called",?self.name
????def?print_info(self):
????????print?self.name,?self.height,?self.length,?self.sex,?Horse.variety#,Horse.address
????????Horse.print_variety()?#?在對象方法里通過類調用類方法,避免
????????Horse().print_ci(200,?100)#?對象調用靜態方法
????????Horse.print_ci(200,?100)?#?類調用靜態方法
????@staticmethod
????def?print_ci(x,?y):
????????print?x,?y
????@classmethod
????def?pp(cls):
????????#?類使用類變量
????????print?cls.variety,?Horse.variety,?cls.address
????????#cls.print_variety()
????????print?Horse().name??#?對象使用對象的成員變量
????@classmethod
????def?print_variety(cls):
????????cls.address?=?"xi'an"
????????print?"type",?type(cls.address)
????????print?cls.variety,?Horse.variety,?cls.address
????????Horse.pp()#?類調用類方法
????????Horse().print_ci(100,?100)#?對象調用靜態方法
a?=?Horse("xiaoxuanfeng")
b?=?Horse("pilihuo",?sex?=?"female")
a.print_info()
b.print_info()
Horse.print_variety()
print?"*"?*?20
Horse.pp()?#?類調用類方法
Horse.print_ci(12,?23)#?類外類調用靜態方法
a.print_ci(23,?31)?#?類外對象調用靜態方法
原文來自:http://suo.im/5MEtwN
總結
以上是生活随笔為你收集整理的python中扑克牌类设计_Python类的基础设计、使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宽带路由器怎么用
- 下一篇: websocket python爬虫_p