十、給小白看的第三篇Python基礎教程
本文是第三篇,一共四篇打下Python基礎
@Author:Runsen
@公眾號:Python之王
上面兩個基本搞定了Python中數據結構,下面花一篇講講最重要的類。
7、面向對象編程
萬物皆是對象,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) #Runsen
print (p.__age)
#AttributeError: Person instance has no attribute '__age'
#私有變量訪問不了,報錯
8、繼承
面向對象編程 (OOP),英語全稱:Object Oriented Programming,面向對象編程的一個主要功能就是「繼承」。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。
繼承,其實這樣理解,就是我寫了一個爸爸類和兒子類,爸爸有錢,兒子卻沒錢,於是兒子決定繼承爸爸,調用爸爸的錢(爸爸類的變量和方法)。
繼承一個類,基本使用下面的五個方法。
8.1 直接調用父類屬性方法;
爸爸有錢,兒子卻沒錢,於是兒子用爸爸的錢
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
8,2 強制調用父類私有屬性方法;
爸爸說,你這個兒子,老是用我的錢,我決定藏私房錢。兒子試試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
8.3 重寫父類屬性方法;
突然間兒子竟然有錢,決定不用爸爸的錢,用自己的錢,決定重寫父類屬性方法。
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
8.4 調用父類的__init__方法
如果爸爸把錢放在__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
8.5 繼承父類初始化過程中的參數
有的時候,爸爸需要掙錢和花錢,就是我們初始化過程中的參數,兒子很好奇,決定看看爸爸口袋還要多少錢。
我們這裡先寫死了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並增加額外參數c
class 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類的繼承,調用父類的屬性和方法基礎內容,可以自己動手寫些案例,加深理解。
9、輸入/輸出
程序與用戶的交互需要使用輸入/輸出,主要包括控制台和文件;對於控制台可以使用input和print。input(xxx)輸入xxx,
然後讀取用戶的輸入並返回。
In [1]: input()
1
Out[1]: '1'
10、文件輸入/輸出
可以使用file類打開一個文件,使用file的read、readline和write來恰當的讀寫文件。對文件讀寫能力取決於打開文件時使用的模式,
常用模式
- 讀模式(“r”)
- 寫模式(“w”)
- 追加模式(“a”)
文件操作之後需要調用close方法來關閉文件。如果用with open就不用slose了。
還有r+,w+,a+
- r:僅僅表示讀入
- r+:既可以讀取還可以寫入
- w: 僅僅表示寫入
- w+:既可以讀取還可以寫入
但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") #默認r
while 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
11、存儲器
存儲器,大家應該不知道。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"]
12、異常
當程序中出現某些異常的狀況時,異常就發生了。
python中可以使用try ... except
處理。
try:
print (1/0)
except ZeroDivisionError as e:
print(e)
except:
print( "error or exception occurred.")
#integer division or modulo by zero
『
本文已收錄 GitHub,傳送門~ ,裏面更有大廠面試完整考點,歡迎 Star。