練習代碼倉庫地址: https://gitee.com/yangpengfi/pythonStudy/tree/master (day5\day6)
面向對象介紹
- 世界萬物,皆可分類
- 世界萬物,皆爲對象
- 只要是對象,肯定屬於某種類
- 只要是對象,肯定有屬性
爲什麼要用面向對象開發?
- 編程:語法+數據結構+算法
- 編程範式:面向過程和麪向對象、函數式編程
- 面向過程:多用於簡單的、一次性的任務
- 面向對象:是利用‘類’和‘對象’來創建各種模型來對真實世界的描述,多用於功能複雜的
類、對象
class
- 一個類即是對一類有相同屬性的對象的抽象、藍圖、原型(用來描述具有相同的屬性和方法的對象的集合)。在類中定義了這些對象都具備的屬性和共同方法。對象是類的實例。
object
- 一個對象即是一個類的實例化後實例,一個類必須經過實例化後方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性
- 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。
面向對象的特性:封裝、繼承、多態
-
封裝:在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含着類的數據和方法
- 方法:類中定義的函數。
- 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用。
- 數據成員:類變量或者實例變量用於處理類及其實例對象的相關的數據。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
- 局部變量:定義在方法中的變量,只作用於當前實例的類。
- 實例變量:在類的聲明中,屬性是用變量來表示的。這種變量就稱爲實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
- 實例化:創建一個類的實例,類的具體對象。
- 類的專有方法:
__init__ : 構造函數,在生成對象時調用,做一些類的初始化工作。對象實例化r1 = Role("小米","警察","AK47")相當於Role(r1,"小米","警察","AK47")返回r1.name,r1.role...。傳進來的實參都是實例變量(靜態屬性)。作用域:實例本身 __del__ : 析構函數,釋放對象、銷燬的時候自動執行的,通常用於做一些收尾工作,如關閉一些數據庫鏈接,關閉臨時文件等 __doc__:獲取類的描述信息 __module__:表示當前操作的對象在哪個模塊 __class__:表示當前操作的對象的類是什麼 __call__:打印類裏的所有屬性(對象實例化後的對象加()來執行call方法) __str__:如果一個類中定義了__str__方法,那麼在打印對象時,默認輸出該方法的返回值 __getitem__、__setitem__、__delitem__:用於索引,如字典。分別表示獲取、設置、刪除數據 __new__、__metaclass__:__new__是用來創建實例的(會調用類的__init__),__metaclass__用來表示該類有誰實例化創建來的 __repr__ : 打印,轉換 __setitem__ : 按照索引賦值 __getitem__: 按照索引獲取值 __len__: 獲得長度 __cmp__: 比較運算 __add__: 加運算 __sub__: 減運算 __mul__: 乘運算 __truediv__: 除運算 __mod__: 求餘運算 __pow__: 乘方
-
繼承:一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承
- py2 經典類按深度優先來繼承,新式類按廣度優先來繼承
- py3 經典類和新式類都是統一按廣度優先來繼承
-
多態:態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
反射:
- 通過字符串映射或修改程序運行時的狀態、屬性、方法,有以下四個方法
getattr(object,name,default=none):根據字符串去獲取obj對象裏的對應的方法的內存地址 hasattr(object,name):判斷一個對象obj裏是否有對應的name_str字符串的方法 setattr(obj,y,z):相當於設置 obj.y = z delattr(x,y,z):刪除對象屬性
模塊
1、定義:
- 模塊:用來從邏輯上組織python代碼(變量、函數、類、邏輯:實現一個功能),本質就是.py結尾的python文件(文件名:test.py,對應的模塊名:test)
- 包:本質就是一個目錄(必須帶有一個__init__.py文件)
2、導入方法
import module_kk(一個)
import module_kk,module2_kk(多個)
from module_alex import *(導入模塊內所有方法)
from module_alex import m1,m2,m3(導入模塊內所有部分方法)
from module_kk import sayHello as say(給導入模塊裏的方法取一個別名)
3、import本質(路徑搜索和搜索路徑)
- 導入模塊的本質就是把python文件解釋一遍
- 導入包的本質就是執行該包下的__init__.py文件
4、導入優化
from module_kk import sayHello as say
5、模塊的分類:
a:標準庫(內置模塊) 1)時間模塊 b:開源模塊(第三方模塊) c:自定義模塊
標準庫:
1、time與datetime
- 在python中,通常有這幾種方式來表示時間:
- 1)時間戳
- 2)格式化的時間字符串
- 3)元組(struct_time)共九個元素。
由於python的time模塊實現主要調用c庫,所以各個平臺可能有所不同 time.struct_time(tm_year=2019, tm_mon=8, tm_mday=17, tm_hour=16, tm_min=35, tm_sec=14, tm_wday=5, tm_yday=229, tm_isdst=0)年、月、日、時、分、秒、周天、年天。需要說明的是struct_time實例的各個屬性都是隻讀的,不可修改。
- time模塊的方法:
time() -- 以浮點數的形式返回從1970開始的當前時間(以秒爲單位)——時間戳 clock() -- 以浮點數的形式返回進程啓動以來的CPU時間 sleep() -- 以浮點數表示的延遲數秒 gmtime() -- 將1970年以來的秒轉換爲UTC元組 localtime(time.time() + n*3600) -- 將1970年以來的秒轉換爲本地時間元組 (中國在東八時區即:UTC+8) asctime() -- 將時間元組轉換爲字符串 ctime() -- 將時間(以秒爲單位)轉換爲字符串 mktime(struct_time_instance) -- 將本地時間元組轉換爲從1970年開始的秒的時間戳 strftime(time_format_str, struct_time_instance) -- 根據格式規範將時間元組轉換爲字符串 strptime(time_str, time_format_str) -- 根據格式規範將字符串解析爲時間元組,如:time.strptime('2017-01-13 17:07', '%Y-%m-%d %H:%M') tzset() -- 更改本地時區
- datetime模塊定義了以下幾個類:
datetime.date -- 表示日期,常用的屬性有:year, month和day datetime.datetime -- 表示日期時間 datetime.time -- 表示時間,常用屬性有:hour, minute, second, microsecond datetime.timedelta -- 表示兩個date、time、datetime實例之間的時間間隔,分辨率(最小單位)可達到微秒 datetime.tzinfo -- 時區相關信息對象的抽象基類。它們由datetime和time類使用,以提供自定義時間的而調整。 datetime.timezone -- Python 3.2中新增的功能,實現tzinfo抽象基類的類,表示與UTC的固定偏移量
2、random
- random()隨機0到1之間的浮點數
- randint()
- randrange()
3、os 操作系統- NT或Posix的操作系統例程,這取決於我們所使用的系統。
- 所有功能從posix, nt或ce,如unlink, stat等。
- os.path 是posixpath還是ntpath
- os.name 是'posix', 'nt'或'ce'。
- os.curdir 用('.' or ':')表示當前目錄的字符串。
- os.pardir ('..' or '::')是表示父目錄的字符串
- os.sep ('/' or ':' or '\')路徑名分隔符
- os.extsep (always '.')擴展器
- os.altsep (None or '/')備用路徑名分隔符
- os.pathsep $PATH等中是否使用了組件分隔符
- os.linesep 文本文件中的行分隔符('\r' or '\n' or '\r\n')
- os.defpath 是可執行文件的默認搜索路徑嗎
- os.devnull 是空設備的文件路徑嗎('/dev/null', etc.)
- os.path處理文件路徑
4、sys
5、shutil高級的文件、文件夾、壓縮包處理模塊(實際是對zipfile和tarfile)
6、json和pickle
- json用於字符串和python數據類型進行轉換(用於和其他語言的數據交互)
- pickle用於python特有的類型和python的數據類型間進行轉換
- 均提供dumps、dump、loads、load四個方法
7、shelve模塊是一個簡單的k、v將內存數據通過文件持久化的模塊,可以持久化任何pickle可支持的python數據格式
8、xml處理模塊
9、yaml寫配置文件
10、Configparser處理模塊:用於生成和修改配置文檔
11、hashlib模塊:用於加密相關的操作,提供md5(), sha1(), sha224(), sha256(), sha384(), and sha512()等算法
哈希對象有這些方法:
-
update(arg): 用arg中的字節更新哈希對象。重複調用是否等價於將所有調用連接在一起的單個調用的參數。
-
digest(): 返回傳遞給update()方法的字節摘要到目前爲止。
-
hexdigest(): 與digest()類似,但返回的摘要是一個雙長度的unicode對象,只包含十六進制數字。
-
copy(): 返回哈希對象的副本(克隆)。這可以用來有效地計算共享一個公共初始子字符串的字符串摘要。
例如,要獲取字符串“Nobody inspects the spammish repetition”的摘要:
python import hashlib m = hashlib.md5() m.update(b"Nobody inspects") m.update(b" the spammish repetition") m.digest() # b'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
12、hmac他內部對我們創建key和內容再進行加密
13、re模塊:正則表達式(動態,模糊的匹配)
- 描述:
-
此模塊提供類似於。的正則表達式匹配操作在Perl中找到的。它支持8位和Unicode字符串;這兩個正在處理的模式和字符串可以包含空字節和超出美國ASCII碼範圍的字符。
-
正則表達式可以包含特殊字符和普通字符。大多數普通字符,如“A”、“A”或“0”,都是最簡單的正則表達式;他們只是匹配自己。你可以連接普通字符,使last匹配字符串“last”。
-
特殊字符是:
"." 匹配除換行以外的任何字符。 "^" 匹配字符串的開頭。 "$" 匹配字符串末尾或字符串末尾換行之前的值。 "*" 匹配前面RE的0次或多次(貪婪)重複。貪心意味着它將匹配儘可能多的重複。 "+" 匹配前面RE的一個或多個(貪婪)重複。 "?" 匹配前面RE的0或1(貪婪)。 *?,+?,?? 前三個特殊字符的非貪婪版本。 {m,n} 匹配前面RE的m到n次重複。 {m,n}? 以上非貪婪版本。 "\\" 要麼轉義特殊字符,要麼發出特殊序列的信號。 [] 表示一組字符。 作爲第一個字符的“^”表示補集。 "|" 創建一個匹配A或B的RE。 (...) 匹配括號內的RE。 內容可以稍後在字符串中檢索或匹配。 (?aiLmsux) 爲RE設置A、I、L、M、S、U或X標誌(參見下面)。 (?:...) 正則括號的非分組版本。 (?P<name>...) 組匹配的子字符串可以通過名稱訪問。 (?P=name) 匹配前面由名爲name的組匹配的文本。 (?#...) 評論;忽略了。 (?=...) 如果匹配……匹配next,但不使用字符串。 (?!...) 如果匹配……不匹配。 (?<=...) 如果前面有…(必須是固定長度)。 (?<!...) 如果前面沒有…(必須是固定長度)。 (?(id/name)yes|no) 如果與id/名稱匹配的組匹配yes模式,則匹配(可選)no模式。
- 特殊序列由“\”和列表中的一個字符組成在下面。如果普通字符不在列表中,則結果RE將匹配第二個字符。
\number 匹配相同編號的組的內容。 \A 僅在字符串的開頭匹配。 \Z 只匹配字符串的末尾。 \b 匹配空字符串,但僅在單詞的開頭或結尾。 \B 匹配空字符串,但不匹配單詞的開頭或結尾。 \d 匹配任何十進制數字;等價於字節模式或帶ASCII標誌的字符串模式的集合[0-9]。 在沒有ASCII標誌的字符串模式中,它將匹配Unicode數字的整個範圍。 \D 匹配任何非數字字符;相當於 [^\d]。 \s 匹配任何空白字符;等同於[\t\n\r\f\v],以字節模式或帶ASCII標誌的字符串模式表示。 在沒有ASCII標誌的字符串模式中,它將匹配Unicode空白字符的整個範圍。 \S 匹配任何非空白字符;相當於 [^\s] \w 匹配任何字母數字字符;相當於[a-zA-Z0-9_]的字節模式或帶ASCII標誌的字符串模式。 在沒有ASCII標誌的字符串模式中,它將匹配Unicode字母數字字符(字母加數字加下劃線)的範圍。 使用LOCALE,它將匹配set[0-9_]加上爲當前LOCALE定義爲字母的字符。 \W 匹配非[a-zA-Z0-9_]。 \\ 匹配文字反斜槓。
-
- 該模塊導出以下功能:
match 將正則表達式模式匹配到字符串的開頭。 fullmatch 將正則表達式模式匹配到所有字符串。 search 搜索字符串以尋找模式的存在。 sub 替換字符串中出現的模式。 subn 與下標相同,但也返回所做替換的個數。 split 根據模式的出現情況拆分字符串。 findall 查找字符串中出現的所有模式。 finditer 返回一個迭代器,爲每個匹配生成一個匹配對象。 compile 將模式編譯爲RegexObject。 purge 清除正則表達式緩存。 escape 在字符串中反斜槓所有非字母數字。
- 該模塊中的一些函數將標誌作爲可選參數:
A ASCII 對於字符串模式,讓\w、\w、\b、\b、\d、\d匹配對應的ASCII字符類別(而不是整個Unicode類別,這是缺省值)。 對於字節模式,此標誌是惟一可用的行爲,不需要指定。 I IGNORECASE 執行不區分大小寫的匹配。 L LOCALE 根據當前地區設置\w、\w、\b、\b。 M MULTILINE “^”匹配行開頭(換行之後)和字符串。 “$”匹配行尾(換行之前)和字符串尾。 S DOTALL 匹配任何字符,包括換行符。 X VERBOSE 忽略空格和註釋,讓簡歷看起來更漂亮。 U UNICODE 僅供兼容性。忽略字符串模式(這是默認值),禁止字節模式。
- “(?P<name>...)”分組匹配 re.search("(?P<province>[0-9]{3})(?P<city>[0-9]{3})(?P<birthday>[0-9]{3})","410482195605203548").groupdict()
練習:選課系統
角色:學校、學員、課程、講師
要求:
1.創建北京、上海2所學校
2.創建Linux,python,go3個課程,linux\py在北京開,go在上海開
3.課程包含週期、價格,通過學校創建課程
4.通過學校創建班級,班級關聯課程、講師
5.1創建學員時,選擇學校關聯班級
5.2創建講師時,關聯學校
6.提供兩個角色接口
6.1學員視圖,可以註冊,交學費,選擇班級
6.2講師視圖,講師可管理自己的班級,上課時選擇班級,查看班級學員列表,修改所管理的學員的成績
6.3管理視圖,創建講師,創建班級,創建課程
7.上面的操作產生的數據都通過pickle序列化保存到文件裏