python中扑克牌类设计_Python类的基础设计、使用
類是事物功能和屬性的抽象,對象是類的實例化。就像人人都知道小汽車可以干什么什么的,但光想小汽車如何好是沒有用的,得開車或坐才能感受到小汽車的好。人腦里的小汽車是抽象的,即類,而坐上的某輛車是小汽車的實例化,即對象。所以,如果一門語言提供了、支持面向?qū)ο缶幊痰臋C(jī)制,那么首先得先設(shè)計程序所需要的類,然后再在程序里將這些類實例化產(chǎn)生對象,通過對象這個程序元素(和變量、函數(shù)等起著相同的作用,構(gòu)成程序的基本元素),所以類的設(shè)計是面向?qū)ο缶幊淌欠裼行А⒑侠怼⒊晒Φ年P(guān)鍵。
類
類總的來說是專有數(shù)據(jù)用專用方法處理,即數(shù)據(jù)和處理數(shù)據(jù)方法的集合,故類的里有數(shù)據(jù)(屬性)和函數(shù)(功能),且類里的數(shù)據(jù)必須用類里的方法來操作處理。
類里的這些函數(shù)也有時又稱方法、成員函數(shù),如果方法或函數(shù)作用于類本身稱之為類方法,如果方法作用于由類產(chǎn)生出的實例對象上,這些方法稱之為實例對象的方法。類里的數(shù)據(jù)稱為屬性(類屬性和實例對象屬性)、成員變量。
類不能無源而生,需有自己的父類,而object這個類是Python下的根類(base class),也就是說用戶自己的類可以繼承object 這個類作為自己(父)類的起點,類的父類需要用圓括號括起來放在類名字的后邊。
定義類
基于上邊講述,定義一個常規(guī)的類格式如下:
class?類名字(父類序列):????類的成員變量?=?初值
????def?__init__(self,?形參序列):
????????self.實例對象的成員變量名?=?初值
????????其他語句
????def?其他實例對象函數(shù)名(self,形參序列):
????????語句
????@classmethond
????def?類的成員函數(shù)名(cls,形參序列):
????????cls.類的成員變量名?=?初值
????????語句
????@staticmethond
????def?函數(shù)名(形參序列):
????????語句
類的語法格式里出現(xiàn)了一些奇奇怪怪的符號,下面一一解釋一下。class和定義函數(shù)的def一樣是Python里的關(guān)鍵字,用于定義一個類的標(biāo)識符。
位于class下和_ _init_ _函數(shù)間聲明的變量是類的變量,可被類或類的對象共有。
__init__可以成為類的實例對象的構(gòu)造函數(shù),每次通過類創(chuàng)建一個該類的對象是調(diào)用此函數(shù),所以其下的以sefl.前綴的變量是每個創(chuàng)建好了的實例(化)對象的所獨有的。換句話說,有多少個類的對象內(nèi)存里就有多少份這個實例對象變量存在。就像生產(chǎn)了多少小汽車就有多少個方向盤似的。
self代表運行時的類的實例對象本身,一般在類的內(nèi)部設(shè)計時出現(xiàn),在程序里使用對象編程時不用self。在實例對象的成員函數(shù)里以self.前綴的變量是實例對象的成員變量,沒有self.的變量是本方法函數(shù)的局部變量。
cls和self出現(xiàn)在構(gòu)造和實例對象函數(shù)的第一個參數(shù)位置上一樣,cls關(guān)鍵字出現(xiàn)在類的方法函數(shù)里,區(qū)分于對象函數(shù)和變量時會用到。在類的函數(shù)里以cls.前綴的變量也是類的成員變量,沒有這個前綴的是局部變量。
@classmethon這個關(guān)鍵字是修飾器,修飾也是說下面的函數(shù)是類的方法函數(shù)而不是類的對象的方法函數(shù)。
@staticmethod這個也是修飾器,說明接下來的函數(shù)是一個靜態(tài)函數(shù),和實例對象的成員函數(shù)、類函數(shù)的區(qū)別主要在第一個形參,既無self又無cls??梢员活惢?qū)ο笾苯诱{(diào)用。差不多解釋完了,下面來看一個具體的類的實例程序。
定義一個類的示例
下面創(chuàng)建一個Horse類,類里除了有實例對象的方法函數(shù)、類方法函數(shù)和靜態(tài)方法函數(shù),還有實例對象成員變量和類變量。
#?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).出現(xiàn)在class下一行的variety是類Horse的變量,是類變量,可以通過Horse.variety在類的內(nèi)部或者外部任何地方被訪問。
2).__init__函數(shù)是Horse類的實例對象的構(gòu)造函數(shù),每次創(chuàng)建一個Horse類的實例對象時,這個函數(shù)均會被調(diào)用執(zhí)行,其下以self.開始的變量是每個實例對象的成員變量,即標(biāo)的這個實例對象的屬性、特征用的。
3). 用修飾器@classmethod修飾的兩個函數(shù)pp、print_variety,是類Horse的類函數(shù),類函數(shù)只可通過類或cls使用。在pp這個函數(shù)里可以看出一點,在類的內(nèi)部類變量的使用需前綴類名.或cls.。
類名.類變量cls.類變量
從print_variety函數(shù)可以看出,在類的內(nèi)部可以通過類調(diào)用類的方法函數(shù)。
類名.類方法4).用@staticmethod修飾的print_ci函數(shù)是靜態(tài)函數(shù),它的第一個參數(shù)不是特殊的self或者cls,靜態(tài)函數(shù)可在類內(nèi)部或類的外部調(diào)用,也可被類的對象調(diào)用。
創(chuàng)建對象
面向?qū)ο缶幊虒嶋H是在設(shè)計好類以后,用與類同名的函數(shù)來創(chuàng)建類的對象,用類的對象調(diào)用對象的方法函數(shù)來編寫整個程序,有時可能根據(jù)需要少量地用類調(diào)用類方法的語句代碼出現(xiàn),一般都是對象調(diào)用類里設(shè)計好的對象方法函數(shù)來完成整個程序的功能,故稱面向?qū)ο缶幊獭?/p>
創(chuàng)建類的實例對象的語法:
變量?=?類名([參數(shù)序列])通過這樣的方式創(chuàng)建類的實例對象本質(zhì)是調(diào)用了類里的_ _ init_ ()方法函數(shù),括號里的[參數(shù)序列]意思是看 _ init_ _()方法函數(shù)是否有除self外的其他形參,如無,換括號里沒有任何實參。
需要特別說明的是任何實例對象的self形參不用賦值,在Python解譯執(zhí)行程序語句時self代表點兒運算符(.)前的實例對象,或者說self被Python賦值為點兒運算符前的實例對象。
a?=?Horse(sex?=?"male")b?=?Horse(name?=?"marong",?sex?=?"female")
面向?qū)ο缶幊淌纠?span style="font-weight:bold;">
面向?qū)ο缶幊?#xff0c;需要兩步,第一步先設(shè)計好類,第二步基于類創(chuàng)建對象并通過對象調(diào)用函數(shù)來完成整個程序需要實現(xiàn)的功能。下面是本節(jié)課設(shè)計的一個Horse類的面向?qū)ο蟪绦蛟O(shè)計的完整示例。
#?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()?#?在對象方法里通過類調(diào)用類方法,避免
????????Horse().print_ci(200,?100)#?對象調(diào)用靜態(tài)方法
????????Horse.print_ci(200,?100)?#?類調(diào)用靜態(tài)方法
????@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()#?類調(diào)用類方法
????????Horse().print_ci(100,?100)#?對象調(diào)用靜態(tài)方法
a?=?Horse("xiaoxuanfeng")
b?=?Horse("pilihuo",?sex?=?"female")
a.print_info()
b.print_info()
Horse.print_variety()
print?"*"?*?20
Horse.pp()?#?類調(diào)用類方法
Horse.print_ci(12,?23)#?類外類調(diào)用靜態(tài)方法
a.print_ci(23,?31)?#?類外對象調(diào)用靜態(tài)方法
原文來自:http://suo.im/5MEtwN
總結(jié)
以上是生活随笔為你收集整理的python中扑克牌类设计_Python类的基础设计、使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 宽带路由器怎么用
- 下一篇: uwsgi 常用操作