Python高階語法之一
-
面向物件三大特點:封裝、繼承、多型;封裝幫助完成物件並關注完成功能的結果。
類名建議都用大駝峰(每個單詞首字母都大寫),方法一般小駝峰(第二個單詞首字母大寫)
方法就是把函式放類裡引數加上self即可,如下:(物件通過類創建出來,建立物件的過程叫例項化。要有物件必須先建立類)
- 初始化方法 __init__(self,[形參]),在其內繫結初始屬性,建立物件時自動呼叫。__str__(self) 方法返回一個字元物件,必須有返回
- 物件相關操作
dir(物件) 檢視物件上有哪些屬性和方法,可以檢視list、dict、string上的方法,例如dir(‘111’)、dir(10);
type() 獲取物件的型別;
isinstance(物件,型別) 判斷一個物件是否是指定型別,例如print(isinstance(11,int))
- 私有成員
__雙下劃線開頭的私有屬性在類外面無法訪問
class Method():
def __init__(self,name,age):
self.name = name
self.__age = age
# 私有方法,類外無法直接訪問,只能通過下面的方法返回才能訪問
def getAge(self):
return self.__age
m = Method('lcx'
print(m.name)
print(m.getAge())
print(m.__age) #類直接訪問類的私有屬性,會報類沒有該屬性
輸出如下:
Traceback (most recent call last):
File "D:/script/pytest_yqyx/test/day1.py", line 16, in <module>
print(m.__age)
AttributeError: 'Method' object has no attribute '__age'
lcx
10
- 類的繼承
1、繼承特點:
1.1、如沒有任何父類繼承,()可以不寫,如要寫,寫(object)
1.2、object為基礎類,如沒指定繼承,預設自動繼承該類
1.3、私有成員只能在本類中訪問,子類不能繼承和使用
2、多繼承,一個類同時可以繼承多個父類
class 類名(父類1,父類2…):
pass
3、 多層繼承,子繼承父親且繼承祖父
4、繼承的重寫(重點掌握):子類中出現與父類相同的屬性名或者方法名(當父類上的方法不能滿足子類的要求時,但不能改父類程式碼,只能在子類重寫父類的方法)
子類呼叫父類上的方法:super().父類方法名([實參])
多型:呼叫相同的方法,實現不同的功能
- 類屬性及方法
1、類屬性與例項屬性:類屬性是儲存到類上的,所有物件都可共享; 例項屬性是儲存到,只有例項化後才能訪問
1.1、類屬性及例項屬性的建立
class 類名(object):
類屬性名=值
def __init__(self,name,age):
self.例項屬性名=值
類名.類屬性名=值
1.2、類屬性訪問:類名.類屬性名
2、類方法和靜態方法
2.1、類方法:
2.1.1、類方法語法及呼叫
class 類名(object):
@classmethod
def 類方法名(cls):
pass
呼叫(不用建立物件,直接類名呼叫):類名.類方法名([實際引數])
2.1.2、類方法只能使用類上的屬性和方法: 類名.類屬性名(無需要例項化);cls(class)代表的是類本身 cls.類屬性名
舉例如下:
2.2、靜態方法:當方法中不使用類上的成員時,就定義為靜態方法
2.1.1、靜態方法語法及呼叫
class 類名(object):
@staticmethod
def 靜態方法名():
pass
呼叫(不用建立物件,直接類名呼叫):類名.靜態方法名([實際引數])
舉例如下:
3、瞭解__new__(開闢空間)方法:底層用於開闢物件空間的方法,所以優先於__init__(初始化屬性)方法呼叫。該方法微調物件的建立過程。
語法:
class 類名(object):
def __new__(cls,[形參]):
#開局記憶體空間
super().__new__(cls)
def __init__(self,[形參]):
#繫結初始屬性
備註:兩方法的引數要一致。因為所以類都預設繼承object,通過super().__new__(cls)就開闢了空間,最後將建立的物件返回
Class Student(object):
Def __new__(cls,*args,**kwra):
print(“改變空間”)
super().__new(cls)
Def __init__(self,name,age):
Self.name=name
Self.age=age
Stu = Student(‘lcx’,20)
Print(stu)
單例模式
- 異常
異常:就是Python程式碼中的錯誤,如果出現錯誤 程式碼執行的時候 丟擲異常,並且中斷程式碼執行。錯誤不可避免,但應將錯誤捕獲,讓程式碼繼續執行。現在我們看下如何捕獲異常。
語法:
try:
程式碼塊,可能出錯
except [異常型別名1]: #獲取異常
處理異常(列印,儲存到檔案;或繼續丟擲)
except [異常型別名2]: #獲取異常
處理異常(列印,儲存到檔案;或繼續丟擲)
except (異常型別名3, 異常型別名4): #同時捕獲型別3,4
處理異常(列印,儲存到檔案;或繼續丟擲)
1、 異常的型別及捕獲不同型別異常
1.1、 異常分不同型別 異常->型別->有不同的類組成->異常資訊(物件),舉例如下:
print(aaa) #NameError: name 'aaa' is not defined
open("lcx.txt") #AttributeError: 'NoneType' object has no attribute
'name'
li = [1,2,3]
print(li[111]) #IndexError: list index out of range
BaseException異常基類,所有異常都繼承它。所有能捕獲並讓程式碼繼續執行的錯誤,都是Exception型別或其子型別、系統錯誤型別可以捕獲,但不建議捕獲系統錯誤型別
#try裡若有多行程式碼,其中一行出錯後,其下的程式碼將不被執行;若指定錯誤型別,那隻捕獲指定的型別,下面只捕獲NameError,FileNotFoundError
try:
print(aaa)
with open('./data.txt', 'r') as f:
print(f.readlines())
except (NameError,FileNotFoundError):
print('aaa打印出錯,繼續執行')
print(222)
1.1、 捕獲所有型別的錯誤,except後不指定型別或指定為Exception即捕獲所有型別
語法一: 語法二:
try: try:
程式碼塊 程式碼塊
except: except Exception:
異常處理 異常處理
舉例如下:
try: try:
print(aaa) print(aaa)
except: except Exception:
print('aaa出錯,繼續執行') print('aaa出錯,繼續執行')
print(222) print(222)
1.2、 獲取系統提供的錯誤資訊(異常物件),except後加as
try:
程式碼塊,可能出錯
except 異常型別名1 as e :
print(e)
處理異常(列印,儲存到檔案;或繼續丟擲)
except (異常型別名2, 異常型別名3)as e:
print(e)
處理異常(列印,儲存到檔案;或繼續丟擲)
1.3、try…except的完整語法
try:
程式碼塊,可能出錯
except 異常型別名1 as e :
print(e)
處理異常(列印,儲存到檔案;或繼續丟擲)
except (異常型別名2, 異常型別名3)as e:
print(e)
處理異常(列印,儲存到檔案;或繼續丟擲)
else:
無異常時執行這塊
finally:
這裡都會執行
舉例如下:
1.1、 raise將錯誤資訊直接丟擲;raise異常類名(“自定義錯誤資訊”)自定義錯誤資訊丟擲,raise Exception(“自定義資訊”);下面分別舉例:
- 模組及包
1、一個py檔案就是一個模組,一次性匯入模組所有內容 import 模組名;單獨匯入模組中的某個內容:from 模組名 import 類/函式/變數/* *代表所有
限制匯入模組的內容:__all__=[‘內容1’,‘內容2’……] 允許被匯入的寫到[]裡面
1、 包:其實就是一個目錄(資料夾);為什麼使用包:難免模組(檔案)會重名。不同目錄下的模組名可以重名。標準包下會有__init__.py檔案,包的初始化檔案。
2.1、包的匯入兩種方式:
import 模組名
import 包名.模組名
from 包名.模組名 import *
from 包名.模組名 import 類/函式/變數
from 包名 import 模組1,模組2
from 包名 import * #匯入該包下所有模組
直接通過包名匯入所有模組後,使用會有錯誤提示,如下所示:
解決方法:需要在被匯入包common下的初始化模組__init__第一行加入允許匯入的模組名,如下所示:
魔術方法和魔術變數如下:
2.2、模組定位(重要)
#匯入模組時:看模組的位置;若出 ModuleNotFoundError 錯,解決方法
a、內建模組位置在python直譯器裡,隨時匯入使用。檢視方式
import sys
print(sys.modules)
b、標準模組位置:在python安裝目錄下的Lib中,anaconda3\Lib 下所有模組,自帶 隨時匯入可用,舉例import os
import sys
c、自定義模組:放在主執行檔案(python.ext)所在的當前目錄下或其子目錄下
d、第三方模組安裝目錄:anaconda3\Lib\site-packages
e、定義指定模組路徑,用法
import sys
print(sys.path)
sys.path.append(“自定義路徑”) #新增路徑到列表的最後
sys.path.append(0,“自定義路徑”) #新增路徑到列表的開頭
舉例如下:
import sys
sys.path.append('D:\\script\\pytest_yqyx\\common')
print(sys.path)
2.3、解決模組出錯
明確模組的查詢順序,按順序排除錯誤:內建->標準->當前->第三方模組安裝路徑->自定義
- 給程式傳引數、列表推導式(重點)、集合(set)、列表(list)、元組(tuple)
1、 給程式傳引數
1.1、 程式所需要資料來源:外部錄入、檔案讀取、給程式傳遞引數
Python.exe ./指令碼.py 引數1 引數2……
1.2、 列表推導式(重要):用於快速生成簡單列表(可以進行簡單的運算)
語法:[運算表示式 for i in 容器li1=[i for i in range(1,11)] #生成1-10的列表
li2 =[i**2 for i in range(1,11)] # 生成1-10 數的平方列表
li3 = [i for i in range(1,11,2)] #生成1-10中的奇數
li4 = [i for i in range(1,11) if i%2==0] #生成1-10中的偶數
name1 = ["name","age","sex"]
name2 = ["lcx",30,"f"]
dict1 = {a:b for a,b in zip(name1,name2)} #將兩個列表合成字典
dict2 = {chr(a):random.randint(1,30) for a in range(97,102)} #生成Key是從a到e,value是1-30中任意數的字典
li5 = list(range(1,15))
li6 = [li5[i:i+3] for i in range(0,len(li5),3)] #把列表裡的元素分組,3個一組
print('li1:%s' %li1)
print('li2:%s' %li2)
print('li3:%s' %li3)
print('li4:%s' %li4)
print('li6:%s' %li6)
print('dict1:%s' %dict1)
print('dict2:%s' %dict2)
輸出結果如下:
li1:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
li2:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
li3:[1, 3, 5, 7, 9]
li4:[2, 4, 6, 8, 10]
li6:[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14]]
dict1:{'name': 'lcx', 'age': 30, 'sex': 'f'}
dict2:{'a': 17, 'b': 26, 'c': 21, 'd': 7, 'e': 5}
1.3、 集合的特殊用法
資料型別之間可以相互轉換
& 交集 a&b
| 並集 a|b
- 差補;==等於;!=不等於;in屬於;not in 不屬於
# 取上面兩個列表的交集(先轉換成元組,取交集後再轉換成列表)
list = list(set(li1) & set(li2))
print(list)
- 階段總結:
面向物件的三大特徵是?
答:封閉、繼承、多型
簡述類的作用?類中可以有什麼?
答:類用來描述現實生活中的事物。類中可以有方法屬性(新增:類裡面,方法外面;類名.屬性名),類屬性、例項屬性(新增 物件.屬性名;self.屬性名)。初始方法、例項方法(通過例項呼叫)、類方法(@@classmethod,第一個引數cls),靜態方法(@staticmethod);類方法和靜態方法通過類名直接呼叫。
簡述__init__,__new__的作用及呼叫時機?
答:__init__ 繫結初始屬性;__new__開闢例項空間
什麼是私有成員?私有成員的好處?
答:雙下劃線開頭為麼有成員;好處對私有成員的保護作用。
什麼繼承?繼承的分類?
答:具有從屬關係的類,子類繼承父類;單 繼承,多層繼承,多繼承
什麼是重寫?通過一段程式碼闡明
答:子類中有跟父類中相同的屬性名或方法名;父類不具備子類的功能才會重寫
什麼是例項屬性和類屬性?類屬性的特點及訪問方式。
答:物件上繫結屬性為例項屬性。類屬性所有物件共享。通過類名直接訪問。
什麼是靜態方法和類方法?寫一段程式碼
寫一個簡單的模式
異常的完整語法?
try:
…
except:
…
else:
…
finally:
…
如何丟擲異常?
答:Raise 或raise 異常名(“自定義資訊,可無”)
什麼是模組?什麼是包?
包:帶__init__.py模組的資料夾;模組:包下的.py檔案
匯入模組和包的方式有哪些?
模組的定位方式?
答:5種
寫出一段Python程式碼實現刪除一個List裡面的重複元素
List1 = [1,2,3,4,2,3]
L=list(set(List1))
快速獲取1-100中的奇數
[ i for i in range(1,101,2)]