python语言用什么关键字来声明一个类_Python语言和标准库(第三章:类和对象)...
python如何將函數和數據整合在一起,并且通過一個對象的名稱訪問它們。
如何和為什么使用類與對象,以及他們如何使編程人員易于多種情形下編寫和使用程序。
3.1考慮編程
現在要在python中創建一個對對象的描述,您已有足夠的只是獲得兩個視圖。第一個是數據視圖,除了頂層或者全局作用域的數據外,可以根據需要使用和清除它們。另一個函數視圖,他們沒有固有的數據,而是操作提供給他們的數據。
3.1.1對象的含義
任何一個數據都有對象,每個對象都由3部分組成:標識,類型和值。對象的標識代表該對象在內存中存儲的位置(不可改變的),對象的類型表明它可以擁有數據和值的類型,在對象中,可變類型的值可以更改,不可變類型的值不能更改。
簡單些的解釋是參考本書中已經介紹的對象。例如,整型,字符串,列表等都是對象。可以在程序中很方便地使用這些對象,但是將關系緊密的對象整合在一起豈不是更有意義?這就是類的由來,類允許定義一組對象,并將他們封裝到一個方便的空間去。
3.1.2已經了解的對象
3.1.3如何使用對象
3.2定義類
當思考包含幾百行python代碼的小程序如何運行時,經常可以發現程序將數據組織成組的形式——當訪問某個數據時,將影響與該數據一起協作的數據。經常會碰到有依賴關系的完整數據列表,如列表1的第一個元素和列表2和列表3中的第一個元素匹配。有時,必須通過創造性地將這些列表組合起來才能解決這個問題。python運用了創建用作占位符的整個類的概念,類起了占位符的作用,當一個類被調用時,它創建了綁定到一個名稱的對象。
3.2.1如何創建對象
定義一個類
使用關鍵字class,在后面緊跟一個名稱來完成。
class Fridge:
由類創建對象
>>>f=Fridge()
此時還沒有定義任何復雜的類,Fridge類基本是空的,它作為一個起點。然而,即使他是空的,也應當注意到已經創建了一個可用的空類,它幾乎不進行任何操作。
花上幾分鐘看_init_和self部分,則是類的兩個非常重要的特征,當python創建對象時,_init_方法傳遞給對象第一個參數。而self實際上是代表該實例本身的變量。
編寫內部方法
這個內部方法,不能判斷當前傳入的類型是否有效,應當用接口函數去檢測。在允許的每個地方做檢查是一個好想法,但在當前這個例子中,不打算在此處檢查,因為只會以非常簡單的方式使用_add_multi方法。
編寫接口方法
為了更快捷,現在可以不輸入文檔字符串,此處的方法使您在遇到問題時,可以更好地理解代碼的實際操作。
這些方法需要縮進在Fridge類的定義中,看上去每行的初始位置開始的任何代碼實際上是前一行的延續,應當輸入到同一行上:
defadd_one(self, food_name):if type(food_name) != type(""):raise TypeError,"add_one requires a string,given a %s"%type
(food_name)else:
self._add_multi(food_name,1)returnTruedefadd_many(self, food_dict):if type(food_dict) !=type({}):raise TypeError("add_many requires a dictionary,got a %s"food_dict)for item infood_dict.keys():
self._add_multi(item, food_dict[item])return
add_one和add_many的目的是類似,并且每個方法都有可以確保他們被正確使用的代碼,他們都可以使用add-multi來完成主要工作。現在,如果add-multi的工作方式分發生改變,開發人員可以節省時間,因為它將自動改變使用它的兩個方法的行為方式。
現在已經編寫了足夠的代碼,可以把食物放入Frige對象中,但是沒有方法可以將放入冰箱的食物拿出來。可以直接訪問object.items字典,但是除了測試的時候,這種不是一個好主意。但是現在就是測試,為何不這樣做呢?
>>>f = Fridge({"eggs":6,"milk":4,"cheese":3})>>>f.items
{'cheese':3,'eggs':6,'milk':4}>>>f.add_one("grape")
True>>>f.items
{'cheese':3,'eggs':6,'grape':1,'milk':4}>>>f.add_many({"mushroom":5,"tomato":3})>>>f.items
{"tomato":3,'cheese':3,'grape':1,'mushroom':5,'eggs':6,'milk':4}
目前為止輸入的代碼都能正常工作了,接下來需要增加可以判斷冰箱中是否存在某物的方法。
編寫代碼真是某物是否在冰箱中存在很重要,因為它可以用于取出食物的方法中,如get_one,get_many,get_ingredients,從而使這些方法可以檢查冰箱中是否有足夠多所需的食物,這正是has和has_various方法的用途。
def has(self,food_name,quantity=1):returnself.has_various({food_name:quantity})defhas_various({self,foods):try:for food infoods.keys():if self.items[food]
使用更多的方法:
現在可以使用python-i或者Run with Interpreter命令調用ch6.py文件,這樣可以使用調價到Fridge類的任何代碼。如果出現錯誤而不是>>>提示符,注意拋出的異常,并試圖修復縮進問題,拼寫錯誤或者其他基本錯誤。
Fridge類可按下述方法使用:
>>>f = Fridge({"eggs":6,"mike":4,"cheese":3})>>>if f.has("cheese",2):
...print("its time to make an omelet")
...
its time to make an omelet
實例說明:現在已經定義了新的方法,f對象可以使用它們,當用雞蛋牛奶以及奶酪重新創建f對象時,就從新的fridge類創建對象,因此它擁有新添加的可用方法。
最后,我們應當討論從冰箱中取食物的方法了。與向冰箱中添加食物的方法類似,由一個核心方法完成主要工作,所有接口方法都是依賴于這個方法。
def_get_multi(self,food_name,quantity):try:if(self.items[food_name] isNone):returnFalse;if(quantity>self.items[food_name]):returnFalse;
self.items[food_name]= self.items[food_name]-quantityexceptKeyError:returnFalsereturn quantity
定義后,可以創建文檔字符串指定的方法,其中每個方法都是使用_get_multi,因此都可以最少的額外代碼從冰箱中取出食物:
3.2.2對象和它們的作用域
函數為他們使用的名稱創建了自己的空間,也就是作用域。當函數被調用時,聲明了名稱并賦予值之后,只要函數還在使用,任何對該名稱做出的修改會持續下去。然而,在函數結束運行后,并在此被調用,之前電泳過程中所做的工作都丟失了,改函數必須重新開始執行。
對象中的值可被存儲的,并關聯在self中,就是說self是指向對象的。
創建另外一個類:
我們創建了一個fridge類,現在創建omelet類:
現在有一個類,它目的很明確。omelet類有接口方法,使得它可與fridge對象協作,它仍具備創建指定煎蛋卷的功能。
下面代碼都必須在omelet類定義下縮進一個級別:
def_ingredients_(self):returnself.needed_ingredientsdefget_kind(self):returnself.kinddefset_kind(self,kind):
possible_ingredients=self._known_kinds(kind)if possible_ingredients ==False:returnFalseelse:
self.kind=kind
self.needed_ingredients=possible_ingredientsdefset_new_kind(self,name,ingredients):
self.kind=name
self.needed_ingredients=ingredientsreturn
def_known_kind(self,kind):if kind == "cheese":return {"eggs":2,"mike":1,"cheese":1}elif kind == "mushroom":return {"eggs":2,"mike":1,"cheese":1,"mushroom":2}elif kind == "onion":return {"eggs":2,"mike":1,"cheese":1,"onion":1}else:
self.kind=kind
self.needed_ingredients=ingredientsreturn
defget_kown_kinds(self,fridge):
self.from_fridge=fridge.get_ingredients(self)defmix(self):for ingredient inself.from_fridge.keys():print("Mixing %d %s for the %s omelet"%self.from_fridge[ingredient],ingredient,self.kind)
self.mixed=truedefmake(self):if self.mixed ==true:print("cooking the %s omelet!"%self.kind)
self.cooked=true
現在有一個omelet類可以創建omelet對象,omelet類與煎蛋卷的過程有相同的特性。并且Omelet的外在表現集中到幾個簡單的接口
現在有兩個類,用python -i或者run with Interpreter命令加載他們后,可制作一個煎蛋卷:
我們還可以制作多個煎蛋卷:
這樣的編程方式,我們稱之為面向對象,為什么會用于編制大型系統。
總結
以上是生活随笔為你收集整理的python语言用什么关键字来声明一个类_Python语言和标准库(第三章:类和对象)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp无法连接虚拟机_一步步编写操作系统
- 下一篇: 冬日惊雷剧情介绍