1. 程式人生 > 其它 >Python高階語法之一

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'

,10)
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是從aevalue1-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)]