本文是第三篇,一共四篇打下Python基礎
上面兩個基本搞定了Python中資料結構,下面花一篇講講最重要的類。
萬物皆是物件,Python當然支援物件導向程式設計。類和物件是物件導向程式設計的兩個主要方面,類建立一個新的物件,物件是這個類的範例。
物件可以使用類的變數,屬於物件或類的變數被稱為域;物件也可以使用屬於類的函數,這樣的函數稱為類的方法;域和方法可以合稱為類的屬性。
域有兩種型別
它們分別被稱為範例變數和類變數。
類使用關鍵字class
建立,類的域和方法被列在一個縮排塊中。
類的方法必須有一個額外的第一個引數,但是在呼叫時不為這個引數賦值,這個特殊變數指物件本身,按照慣例它的名稱是self,類似Java中的this。
在類中下面兩個特都方法需要注意:
__init__
方法:在類的一個物件被建立時呼叫該方法;相當於c++中的建構函式,就是當這個類呼叫了,那麼這個__init__ 方法就要執行。
__del__
方法:在類的物件被銷燬時呼叫該方法;相當於c++中的解構函式。在使用del刪除一個物件時也就呼叫__del__方法,__del__是最後呼叫的。
Python中所有的類成員(包括資料成員)都是public的,沒有Java的私有類,也就是人人都有呼叫類,雖然編寫變成很簡單, 但是資源人人都可以隨意分配存取,在專案中確實一個不好的東西。
但是Python 類的卻有私有變數和私有方法之說,這個是一個例外,如果使用的資料成員以雙下劃線為字首,則為私有變數。
你範例化這個類,存取不了。這是很多人忽略 的
比如:
class public(): _name = 'protected型別的變數' __info = '私有型別的變數' def _f(self): print("這是一個protected型別的方法") def __f2(self): print('這是一個私有型別的方法') def get(self): return(self.__info) pub = public()# 先列印可以存取的print(pub._name) pub._f()####結果如下####protected型別的變數 這是一個protected型別的方法# 列印下類 私有變數和私有方法print(pub.__info) 報錯:'public' object has no attribute '__info'pub._f2() 報錯:pub._f2()複製程式碼
但是私有屬性和方法可以在同一個類中被呼叫
pub.get()#######'私有型別的變數'複製程式碼
上面是很多人不知道的,下面,我來宣告一個Person類
class Person(): Count = 0 def __init__(self, name, age): Person.Count += 1 self.name = name self.__age = age p = Person("Runsen", 20) print(p.Count)# 1 說明我範例化,這個__init__方法就要執行print(p.name) #Runsenprint (p.__age) #AttributeError: Person instance has no attribute '__age'#私有變數存取不了,報錯複製程式碼
物件導向程式設計 (OOP),英語全稱:Object Oriented Programming,物件導向程式設計的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴充套件。
繼承,其實這樣理解,就是我寫了一個爸爸類和兒子類,爸爸有錢,兒子卻沒錢,於是兒子決定繼承爸爸,呼叫爸爸的錢(爸爸類的變數和方法)。
繼承一個類,基本使用下面的五個方法。
爸爸有錢,兒子卻沒錢,於是兒子用爸爸的錢
class Father(): def __init__(self): self.money= 1000 def action(self): print('呼叫父類別的方法') class Son(Father): pass son=Son() # 子類Son 繼承父類別Father的所有屬性和方法son.action() # 呼叫父類別屬性輸出:呼叫父類別的方法 son.money # 呼叫父類別屬性輸出:1000複製程式碼
爸爸說,你這個兒子,老是用我的錢,我決定藏私房錢。兒子試試super()
拿你的私房錢,但是這裡需要注意super()
強制呼叫父類別私有屬性方法,就是重寫方法,私有變數是不能用supper繼承不了,還不可以存取父類別中的私有屬性方法的變數,就是兒子是拿不了私房錢的。
class Father(): __money = 1000 #私有變數是繼承不了 def __action(self): # 父類別的私有方法 money = 1000 print('呼叫父類別的方法') class Son(Father): def action(self): super()._Father__action() print(money) son=Son() son.action() 呼叫父類別的方法 name 'money' is not defined複製程式碼
突然間兒子竟然有錢,決定不用爸爸的錢,用自己的錢,決定重寫父類別屬性方法。
class Father(): def __init__(self): self.money = 0 def action(self): print('呼叫父類別的方法') class Son(Father): def __init__(self): self.money = 1000 def action(self): print('子類重寫父類別的方法') son=Son() # 子類Son繼承父類別Father的所有屬性和方法son.action() # 子類Son呼叫自身的action方法而不是父類別的action方法son.money # 自己的1000複製程式碼
如果爸爸把錢放在__init__
,兒子有沒有可能拿到爸爸的錢,都不是私有變數,就不是私房錢,當然可以拿到
我們先看看如果不用super,能不能拿到。
class Father(): def __init__(self): self.money = 1000 class Son(Father): def __init__(self): pass son=Son() print(son.money)# 報錯:'Son' object has no attribute 'money'複製程式碼
連super不用就像拿錢,太小看你爸爸我了。
class Father(): def __init__(self): self.money = 1000 class Son(Father): def __init__(self): super().__init__() #也可以用 Father.__init__(self) 這裡面的self一定要加上(上面兩個相同) son=Son() print(son.money) 1000複製程式碼
有的時候,爸爸需要掙錢和花錢,就是我們初始化過程中的引數,兒子很好奇,決定看看爸爸口袋還要多少錢。
我們這裡先寫死了earn_money和spend_money
class Father(): def __init__(self): self.earn_money=1000 self.spend_money= -500 class Son(Father): def __init__(self): super().__init__() #也可以用 Father.__init__(self) 這裡面的self一定要加上 def add(self): return self.earn_money+self.spend_money son=Son() print(son.add())500複製程式碼
兒子發現爸爸錢不夠,於是偷偷的拿了點錢過來。
class Father(): def __init__(self,a,b): self.earn_money = a self.spend_money= b def add(self): return self.a + self.b #呼叫父類別初始化引數a,b並增加額外引數cclass Son(Father): def __init__(self,a,b,c=1000): # c固定值 Father.__init__(self,a,b) self.son_money = c def add(self): return self.earn_money+self.spend_money + self.son_money son=Son(1000,-500) # 所以c可以不用顯示錶達出來print(son.add()) # 呼叫子類add函數1500複製程式碼
以上基本涵蓋了Python類的繼承,呼叫父類別的屬性和方法基礎內容,可以自己動手寫些案例,加深理解。
程式與使用者的互動需要使用輸入/輸出,主要包括控制檯和檔案;對於控制檯可以使用input和print。input(xxx)輸入xxx, 然後讀取使用者的輸入並返回。
In [1]: input()1Out[1]: '1'複製程式碼
可以使用file類開啟一個檔案,使用file的read、readline和write來恰當的讀寫檔案。對檔案讀寫能力取決於開啟檔案時使用的模式, 常用模式
檔案操作之後需要呼叫close方法來關閉檔案。如果用with open就不用slose了。
還有r+,w+,a+
但r+與w+不同的是,不會把原先存在txt中的東西清空,下面是他們的對比,反正儘量用a+,基本沒什麼錯報出來。
描述 | r+ | w+ | a+ |
---|---|---|---|
當前檔案不存在時檔案 | 丟擲異常 | 建立檔案 | 建立檔案 |
開啟後原檔案內容 | 保留 | 清空 | 保留 |
初始位置 | 0 | 0 | 檔案尾 |
寫入位置 | 標記位置 | 標記位置 | 寫入時預設跳至檔案尾 |
補充個例子吧:
test = '''\ This is a program about file I/O. Author: Runsen Date: 2020/3/31 '''f = open("test.txt", "w") f.write(test) f.close() f = open("test.txt") #預設rwhile True: line = f.readline() if len(line) == 0: break print(line) f.close()######This is a program about file I/O. Author: Runsen Date: 2020/3/31複製程式碼
記憶體,大家應該不知道。python提供一個標準的模組,成為pickle,使用它可以在一個檔案中儲存任何python物件,之後可以完整的取出來,這被稱為持久地儲存物件;還有另外一個模組成為cPickle,它的功能和pickle完全一樣,只不過它是用c寫的,要比pickle速度快(大約快1000倍)。
import pickle datafile = "data.data"mylist = ["Runsen", "is", "20"] f = open("test.txt", "wb+") pickle.dump(mylist, f) f.close()del mylist f = open(datafile,'rb+') mylist = pickle.load(f) print(mylist)#["Runsen", "is", "20"]複製程式碼
當程式中出現某些異常的狀況時,異常就發生了。
python中可以使用try ... except
處理。
try: print (1/0)except ZeropisionError as e: print(e)except: print( "error or exception occurred.")#integer pision or modulo by zero複製程式碼
相關免費學習推薦:
以上就是給小白整理的第三篇Python知識點的詳細內容,更多請關注TW511.COM其它相關文章!