2018年5月28日
第一節(jié)鸠窗,數(shù)字類(lèi)型及序列類(lèi)型
00-數(shù)字類(lèi)型
符號(hào)數(shù)字類(lèi)型(全部不可變)
float浮點(diǎn)數(shù)
bool布爾值(True,False)
complex復(fù)數(shù)
int整數(shù)
浮點(diǎn)數(shù)運(yùn)算不精確(用decimal )
例子: In[1]:? import decimal
?
? ? ? In[2]:? a=decimal.Decimal("1.2")
?
? ? ? In[3]:? b=decimal.Decimal("1.1")
?
? ? ? In[4]: a-b
?
? ? ? Out[5]:? Decimal("0.1")?
?
例子: In[8]:1.2-1.1
?
? ? ? Out[9]: 0.09999999999999987
Ceil : 向上取整
?? ? ? 例子:? In[1]:import math
?? ? ? ? ? ? ? ? ? ? In[2]:math.ceil(5/3)
?? ? ? ? ? ? ? ? ? ? ? Out[3]:2? ? #結(jié)果
//取整運(yùn)算符(無(wú)論除不除得斷,舍棄小數(shù)部分)
%取余運(yùn)算符
**冪運(yùn)算
01-序列類(lèi)型
str(不可變)字符串:“abv”? list(可變)
list(可變)列表:["1",2,"qww"]
tuple(不可變)元組:(1,3.14,"abc")或者(1,)或者1朱巨,
python里內(nèi)置的函數(shù)就是bif
索引取值:
例子:a=[1,'hello','word']或者b=(1,'hello','word')
?? ? ? ? ? ? a[0]或者b[0]
?? ? ? ? ? ? ? 1? ? #輸出
列表可變?cè)M不可變:
a=1? a指向一個(gè)內(nèi)存空間將1存入
a=2? a指向程序再開(kāi)辟一個(gè)的空間沪么,將2存入
a
2
id(a)? 查看a的地址蠢箩,兩次地址不一樣查乒,只是指向改變了祥得,存儲(chǔ)內(nèi)容沒(méi)有變
a=[1,'hello','word']
b=(1,'hello','word')
a[0]=2
a:a=[2,'hello','word']
b[0]=2
b:報(bào)錯(cuò)error
切片操作:
a=[1,'hello','word']
a[0:3]或者a[0:]或者a[:3]或者a[:-1]或者a[-3:]? #左閉右開(kāi),取全部
不同序列類(lèi)型轉(zhuǎn)換:
int(3.14) #出來(lái)整數(shù)3? 其他類(lèi)型也如此
判斷元素是否在列表里:
a=[1,'hello','world']
1 in a? ? #成員運(yùn)算符
True
1 not in a? #成員運(yùn)算符
False
第二節(jié),序列類(lèi)型的方法
00-列表的方法
dir(list)可查詢(xún)list中的方法
增加刪除修改查找復(fù)制
append(加入的元素)? ? ? ? ? ? <加在最后面橄碾,只能插入單個(gè)元素卵沉,可以是列表>clear()? <刪除所有數(shù)據(jù)>索引賦值index(元素) <查找元素位置,有相同元素則只查第一個(gè)法牲,不存在則報(bào)錯(cuò)>copy()
insert(插入的位置史汗,插入元素)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? <只能插入單個(gè)元素>pop(可以添加位置參數(shù))? ? ? <不添加位置參數(shù)則刪除最后一個(gè)元素并返回最后一個(gè)元素>count(元素) <統(tǒng)計(jì)元素在列表中出現(xiàn)次數(shù),如果元素不存在則返回0>反序reverse()
extend(列表或者元組)? ? ? ? ? <可插入多個(gè)數(shù)據(jù)到最后面>remove(元素)? <有相同元素則刪除第一個(gè)>默認(rèn)從小到大排序sort()
01-字符串的方法
查找與判斷修改拼接
count(元素) <統(tǒng)計(jì)元素在字符串里出現(xiàn)次數(shù)拒垃,不存在則返回0>upper()<將所有小寫(xiě)改為大寫(xiě)>+? <用加好直接將字符串拼接起來(lái)>
find(元素)? ? <查找元素索引位置停撞,多個(gè)則只找第一個(gè)出現(xiàn)的,若不存在則返回-1>lower()<將所有大寫(xiě)改為小寫(xiě)>字符串3.join([字符串1悼瓮,字符串2])? ? <將字符串1和字符串2用字符串3拼接在一起>
index(元素)<查找元素索引位置戈毒,多個(gè)則只找第一個(gè)出現(xiàn)的艰猬,若不存在則報(bào)錯(cuò)>strip(元素)<刪除字符串開(kāi)頭和結(jié)尾的字符>
isdigit() <判斷是否全為數(shù)字組成>capitalize() <將第一個(gè)單詞首字母大寫(xiě)>
isalpha()<判斷是否全為字母組成>title() <將所有單詞首字母大寫(xiě)>
endswith(元素)<判斷是否以元素參數(shù)結(jié)尾>split(元素) <將字符串分開(kāi)并將其存入列表,不指定則指定空格副硅,分割符會(huì)被丟掉>
startswith(元素)<判斷是否以元素參數(shù)開(kāi)頭>replace(舊字符姥宝,新字符) <用新字符替換舊字符>
islower()<判斷字符串的字母是否全為小寫(xiě)>
isupper() <判斷字符串所有字母是否為大寫(xiě)>
02-轉(zhuǎn)義字符
\n換行符
\t制表符
\b退格符(光標(biāo)退回一格)
\r光標(biāo)回到開(kāi)頭
\\\
\'‘
\0空字符
\a系統(tǒng)提示音
如果想將字符串轉(zhuǎn)義去掉,在轉(zhuǎn)義前加上r即可
03-元組的方法
查找
count(元素) <統(tǒng)計(jì)元素出現(xiàn)次數(shù)>
index(索引位置) <查找位置的元素>
第三節(jié)恐疲,使用vim編寫(xiě)Python代碼
01-linux常用命令
命令作用命令作用
pwd返回當(dāng)前目錄cat -n install .sh查看文件內(nèi)容并顯示行數(shù)
ls查看當(dāng)前目錄下的文件和文件夾cp (文件名) (復(fù)制的路徑)復(fù)制文件到想去的路徑
cd 路徑(絕對(duì)或相對(duì)路徑)相對(duì)路徑:在當(dāng)前目錄下直接打開(kāi)文件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 絕對(duì)路徑:從根目錄開(kāi)始寫(xiě)rm 文件名刪除文件
cd -返回上一級(jí)(只能返回一次)rm -r 文件夾名刪除文件夾
cd /到根目錄mv 文件名 路徑移動(dòng)文件
cd或者cd ~回到家目錄cd ..上一級(jí)目錄(可重復(fù)使用)
su 用戶(hù)名切換用戶(hù)mkdir創(chuàng)建文件夾
touch 文件名創(chuàng)建文件rmdir刪除空的文件夾
cat 文件名查看文件內(nèi)容
02-vim的使用
交互環(huán)境指我們輸一條就輸出一條
exit() 退出交互環(huán)境
deactivate 退出虛擬環(huán)境
vim 文件名? 用vim編輯文件如果沒(méi)有則自動(dòng)創(chuàng)建
vim有命令模式腊满,輸入模式,末行模式
命令模式:q 退出vim培己,:wq 保存后退出碳蛋,:q!強(qiáng)制退出
進(jìn)入(命令模式)退出(命令模式)移動(dòng)光標(biāo)(命令模式)輸入模式復(fù)制和粘貼刪除
vim 文件名:q? 退出gg (移動(dòng)到第一行)i(進(jìn)入輸入模式)yy(復(fù)制整行)dd(刪除光標(biāo)所在乎)
:wq 保存后退出G(shift+g)(移動(dòng)到最后一行)I(在行首進(jìn)入輸入模式)p(粘貼)dw(刪除光標(biāo)到單詞結(jié)尾)
:q!強(qiáng)制退出^(移動(dòng)到非空格行)a(在光標(biāo)后面一個(gè)字符添加)9yy(復(fù)制9行從光標(biāo)開(kāi)始向下九行)x(刪除光標(biāo)所在的字符)
0(移動(dòng)到行首)A(在行尾進(jìn)行添加)yw(復(fù)制當(dāng)前光標(biāo)到單詞詞尾的內(nèi)容)u(撤銷(xiāo)上一次操作)
$(移動(dòng)到行尾)o(在光標(biāo)下面加一行)ctrl+r(撤銷(xiāo)u操作)
O(在光標(biāo)上面加一行)
塊操作查找
v(光標(biāo)可以自由選中):/a或者?a(查找所有a)
ctrl+v(列塊選擇)n(/向下查找,省咨?向上查找)
shift+*(查找光標(biāo)所在字符串)
命令行按F5自動(dòng)執(zhí)行代碼
03-虛擬環(huán)境使用
虛擬機(jī)用來(lái)裝系統(tǒng)肃弟,
命令意義
workon查看有哪些虛擬環(huán)境
workon 虛擬環(huán)境名進(jìn)入虛擬環(huán)境
deactivate退出虛擬環(huán)境
mkvirtualenv 虛擬環(huán)境名(默認(rèn)python2)創(chuàng)建虛擬環(huán)境
which 程序名查看程序安裝在哪里
mkvirtualenv -p /usr/bin/python3 py3創(chuàng)建名為py3的虛擬環(huán)境
rmvirtualenv 虛擬環(huán)境名刪除虛擬環(huán)境
第四節(jié),格式化輸出零蓉,字符串拼接和深淺復(fù)制
00-格式化輸出
占位符例子
%d“hello %d”%(1)
%s
%f
%cASCII碼格式化
%o8進(jìn)制
%x16進(jìn)制
%e科學(xué)計(jì)數(shù)法
%-8s占位字符最小要8位,并左對(duì)齊
%.2f小數(shù)后面保留2位
%+8d? 正號(hào)笤受,最小占位8位
01-format格式化
例子:“hello{}”.format("world")
"hello {1} {0}".format("world","python")
輸出:hello python world
"hello {ab}".format(ab="python")
輸出:hello python
"{a:<10}".format(a=1234)? ? #后面填充的必須為10個(gè),如果沒(méi)有在前面加空格補(bǔ)齊敌蜂,并左對(duì)齊
"{a:x^10}".format(a=1234)? #后面填充為10個(gè)箩兽,前后用x填充
01-字符串編碼
ASCII碼表:只能表示英文字母和符號(hào)
GBK編碼:中國(guó)特有的
iso指定統(tǒng)一標(biāo)準(zhǔn):unicode字符集:企圖將地球上所有語(yǔ)言囊括,浪費(fèi)空間章喉,更新后出現(xiàn)UTF-8,UTF-16等
Python中都是Unicode方式存儲(chǔ)
編碼:“字符串”.encode("utf8")
解碼:" ".decode("utf8")
02-深淺復(fù)制
針對(duì)列表來(lái)說(shuō)的
列表里可以放列表
a=[1,2,3,["a",1,2]]
a.copy()? #淺復(fù)制汗贫,只能復(fù)制一層,不能復(fù)制里層的列表只能引用
深復(fù)制
import copy
b=copy.deepcopy(a)
03-bytes和bytearray
bytes:二進(jìn)制序列不可修改
bytearray:二進(jìn)制序列可修改
第五節(jié)秸脱,散列類(lèi)型落包,邏輯運(yùn)算符
進(jìn)入后在末尾加workon py3env
ipython? ? #以后直接進(jìn)入Python環(huán)境
00-散列類(lèi)型
01-set(集合)--不可變
不能出現(xiàn)重復(fù)元素,用大括號(hào)括起來(lái)
{1摊唇,“2”咐蝇,3}
set([1,2,3])
&交集
|并集
-差集(補(bǔ)集)
方法
S.add(x)? ? x只能為不可變類(lèi)型S.copy()s.remove()S.issubset(T) 判斷S是否是T的子集
S.clear()S.pop(元素)? 若不添加元素則隨機(jī)刪除一個(gè)S.isdisjoint(T) 有交集返回FalseS.issuperset(T) 判斷T是否是S的子集
S.copy()s.discard()len(S)
s.update(列表或元組)? 添加列表或元組里的內(nèi)容到集合x(chóng) in Sx not in S
02-dict(字典)---可變的散列類(lèi)型
01,定義
di1={'key':'value'}? ? #鍵值對(duì)形式存在巷查,建相當(dāng)于一個(gè)變量
? ? ? ? ? ? ? ? ? ? ? #key不能重復(fù)嘹害,value可以重復(fù),key不能是可變數(shù)據(jù)類(lèi)型吮便,value可以是可變數(shù)據(jù)類(lèi)型
? ? ? ? ? ? ? ? ? ? ? #無(wú)序的
?
di2=dict()? ? ? ? ? ? #定義空字典
02,字典的方法
di1={1:‘s’}
di1.clear()? ? ? #清空字典
dil.setdefault(1,'3')? ? #如果key存在則查詢(xún)幢踏,不存在則添加
dil.pop(1)? ? ? ? ? ? ? #刪除key對(duì)應(yīng)的鍵值對(duì)髓需,不存在則報(bào)錯(cuò)
dil.popitem()? ? ? ? ? ? #隨機(jī)刪除
?
dil.get(1)? ? ? ? ? ? ? #獲取指定key對(duì)應(yīng)的value,不存在則返回none
dil.keys()? ? ? ? ? ? ? #取出所有的key,并輸出一個(gè)list
dil.values()? ? ? ? ? ? #取出所有的value,并輸出一個(gè)list
dil.items()? ? ? ? #取出所有的鍵值對(duì)
dil.updata({3:'7'})? #添加字典到字典房蝉,key重復(fù)則覆蓋
?
di1=dict.fromkeys(('abcd'僚匆,'聆聽(tīng)'))#返回一個(gè)字典微渠,字典的key是第一個(gè)參數(shù)的拆分,value是第二個(gè)參數(shù)
print(dil)
{'b':'聆聽(tīng)','a':'聆聽(tīng)'咧擂,'c':'聆聽(tīng)'逞盆,'d':'聆聽(tīng)'}? #輸出
?
01-運(yùn)算符優(yōu)先級(jí)
優(yōu)先級(jí)從上到下越來(lái)越低
**冪運(yùn)算
+? ? ? -一元運(yùn)算(正負(fù)號(hào))
*? ? ? /? ? ? ? %算術(shù)運(yùn)算符
+? ? -
<? ? ? >? ? ? <=? ? ? >=比較運(yùn)算符
==? ? ? ? !=
=? ? %=? ? /=? +=? ? *=? ? ? ? **=賦值運(yùn)算符
is? ? is not身份運(yùn)算符
in? ? not in成員運(yùn)算符
not>and>or邏輯運(yùn)算符
02-邏輯運(yùn)算
isinstance(1,int)? #用來(lái)判斷參數(shù)1是否為參數(shù)2所表示的類(lèi)型
and #與
or? #或
not? #非
第六節(jié)松申,控制流程
00-條件判斷
if 判斷語(yǔ)句1:
執(zhí)行語(yǔ)句1
elif 判斷語(yǔ)句2:
執(zhí)行語(yǔ)句2
...
else:
執(zhí)行語(yǔ)句
01-三目運(yùn)算
執(zhí)行語(yǔ)句1 if 條件語(yǔ)句 else 執(zhí)行語(yǔ)句
02-條件循環(huán)
while 判斷語(yǔ)句:
? ? 循環(huán)體
break :跳出循環(huán)
else:只要條件不滿(mǎn)足就執(zhí)行else
continue:只結(jié)束當(dāng)前循環(huán)云芦,繼續(xù)下一次循環(huán)
for in obj:
? 循環(huán)體
第七節(jié),函數(shù)基礎(chǔ)
00-函數(shù)基礎(chǔ)
定義:
def 函數(shù)名(參數(shù)):
? pass
? return 表達(dá)式
函數(shù)調(diào)用:
函數(shù)名(參數(shù))
01-函數(shù)參數(shù)
不定長(zhǎng)參數(shù):
*args? 存到元組里
關(guān)鍵字參數(shù):
**kwargs? #將a=1,b=2贸桶,這樣的參數(shù)變成鍵值對(duì)放到字典里舅逸,關(guān)鍵字參數(shù)必須放到參數(shù)最后
02-常見(jiàn)內(nèi)置函數(shù)
sorted(對(duì)象,reverse=True/False)排序皇筛,有返回值ord()字符轉(zhuǎn)ASCII
dir(builtins)查看python里所有函數(shù)chr()ASCII碼轉(zhuǎn)字符
len(對(duì)象)查看對(duì)象長(zhǎng)度f(wàn)ilter(函數(shù)琉历,參數(shù))過(guò)濾器
min()求最小值map(函數(shù),參數(shù))篩選
max()求最大值z(mì)ip(序列類(lèi)型1水醋,序列類(lèi)型2)對(duì)應(yīng)
reversed()反向eval()把字符串當(dāng)成代碼運(yùn)行
sum()求和exec()與eval()用法一樣旗笔,只是沒(méi)有返回值
bin()轉(zhuǎn)換為二進(jìn)制
oct()轉(zhuǎn)換為八進(jìn)制
hex()轉(zhuǎn)換為十六進(jìn)制
第八節(jié),函數(shù)作用域及閉包
00-函數(shù)作用域
匿名函數(shù) lambda
lambda 參數(shù):表達(dá)式
filter(func,a)
filter(lambda x:x%2==0,a)? #輸出a中的偶數(shù)
filter(map(lambda x:x*x,a))
局部變量只能作用于局部
全局變量可作用于局部
globle #聲明全局變量,z在局部修改全局要聲明
nonlocal #修改局部變量
變量命名規(guī)則:
小駝峰規(guī)則:首字母除了第一個(gè)其他都大寫(xiě)
大駝峰規(guī)則:首字母全部大寫(xiě)
全局變量:全大寫(xiě)用下劃線連接
01-閉包
閉包是函數(shù)里面嵌套函數(shù)拄踪,外層函數(shù)返回里層函數(shù)蝇恶,這種情況稱(chēng)之為閉包閉包是概念,不是某種函數(shù)類(lèi)型宫蛆,和遞歸的概念類(lèi)似艘包,就是種特殊的函數(shù)調(diào)用閉包可以得到外層函數(shù)的局部變量,是函數(shù)內(nèi)部和函數(shù)外部溝通的橋梁
閉包:
?
def fx(x):? ?
? ? x += 1
? ? def fy(y):
? ? ? ? return x*y
? ? return fy
?
def calculate(operator='+'):
? ? def add_func(x,y):
? ? ? ? return x+y
? ? def sub_func(x,y):
? ? ? ? return x-y?
? ? if num == '+':
? ? ? ? return add_func
? ? elif num == '-':
? ? ? ? return sub_func
? ? else:
? ? ? ? return None
resualt = calculate('+')
print(resualt(3,2))
resualt = calculate('-')
print(resualt(3,2))
?
02-遞歸和回調(diào)函數(shù)
遞歸
階乘:
?
def factorial(n):? ?
? ? if n == 1:
? ? ? ? return 1
? ? return factorial(n-1)*n
?
遞歸中可以函數(shù)自身調(diào)用自身耀盗,但是使用時(shí)類(lèi)似于條件循環(huán)一樣想虎,要有遞歸的終止條件
?
回調(diào)(函數(shù)里面調(diào)用自己)
示例:
?
def choice(callback, ch):
? ? if ch:
? ? ? ? callback()
? ? else:
? ? ? ? print(‘做一些見(jiàn)不得人的勾當(dāng)')
?
def play():
? ? print(‘好像沒(méi)有人啊')
choice(play, 1)
?
回調(diào)函數(shù): 自身是一個(gè)函數(shù),只是被傳入到另一個(gè)函數(shù)當(dāng)中叛拷,供其調(diào)用
回調(diào)函數(shù)不一定會(huì)被調(diào)用舌厨,是否調(diào)用由被傳入函數(shù)的內(nèi)部邏輯決定
?
第九節(jié),類(lèi)和對(duì)象
00-面向?qū)ο?/p>
相關(guān)的變量和函數(shù)都“封裝”在對(duì)象里忿薇,以對(duì)象為單位整理代碼
01-類(lèi)和實(shí)例
類(lèi):是一類(lèi)事物的抽象裙椭,不是真實(shí)存在的,描繪了該類(lèi)事物的共性
實(shí)例(對(duì)象):某類(lèi)事物的具體個(gè)體署浩,是該類(lèi)事物的具體表現(xiàn)揉燃,它是真實(shí)存在的
類(lèi)一般用大駝峰,函數(shù)一般用小駝峰
#定義類(lèi)
class Person:
?
#實(shí)例化對(duì)象
a=Person()? #實(shí)例化的對(duì)象賦予a
02-屬性封裝
類(lèi)的屬性就是變量
?
封裝在“實(shí)例”里的變量筋栋,是實(shí)例的特征
?
每個(gè)實(shí)例都是一個(gè)獨(dú)立的變量空間
私有屬性:
在屬性前加兩個(gè)下劃線則為私有屬性炊汤,私有屬性只能在類(lèi)里面用
在python中有兩私有屬性,分別是在屬性前加? 一個(gè)下?lián)Q線(_)(被保護(hù)的) 和 兩個(gè)下劃線(__)
?
03-方法
把函數(shù)寫(xiě)在類(lèi)里面就是方法
通常,將默認(rèn)會(huì)傳入的那個(gè)參數(shù)命名為self抢腐,用來(lái)表示調(diào)用這個(gè)方法的實(shí)例對(duì)象本身姑曙。
class Person:
? name="人"
? def func(self):? #self表示一個(gè)實(shí)例對(duì)象
? ? ? ? print("{}:hhhhh".format(self.name))
a=Person()? ? #實(shí)例化一個(gè)對(duì)象
#a.func()? ? #將對(duì)象a傳給了func
#Person.func(1)? #用類(lèi)調(diào)用必須傳個(gè)參數(shù)
a.name="daisy"
a.func()
04-初始化(魔術(shù)方法)
魔法方法:名字前后都有兩個(gè)下劃線。
class Person:
? def __init__(self,name,sex):? #初始化方法迈倍,實(shí)例的時(shí)候自動(dòng)執(zhí)行
? ? self.name=name?
? ? self.sex=sex
a=Person("daisy","nv")
?
第十章伤靠,繼承與魔術(shù)方法
00-繼承
一個(gè)類(lèi)可以繼承一個(gè)類(lèi)(自己有則不繼承,自己沒(méi)有才去繼承)
class A:
? pass
class B(A):? ? #B繼承A
? ? pass? ?
class C(A,B):? ? #多繼承啼染,C先繼承A,再繼承B
? ? ? ? ? ? ? ? #從左到右的原則繼承
? ? pass
?
廣度優(yōu)先算法(python3):一層一層的來(lái)
深度優(yōu)先算法:從一條線走完再?gòu)念^開(kāi)始
類(lèi)名.mro? #查看繼承順序
頂級(jí)基類(lèi)object宴合,python3中默認(rèn)有,python中所有類(lèi)都是從object中繼承來(lái)的
類(lèi)名.bases #查看父類(lèi)
?
01-多繼承
class C(A,B):
? def play(self):
? ? ? A.play(self) #調(diào)用A方法提完,需要什么參數(shù)傳什么
? ? ? print("這是C")
class C(A,B):
? def play(self):
? ? ? super().play()? #都可以用形纺,按順序先A后B,不用傳參數(shù)
? ? ? print("這是C")
02-魔術(shù)方法
class C:
? ? def __init__(self,a):
? ? ? ? self.a=a
? ? def __add__(self,other):? #other和self一樣表示實(shí)例化的對(duì)象
? ? ? ? print(str(self.a)+str(other.a))
? ? def __str__(self):? #使用print時(shí)才會(huì)觸發(fā)徒欣,向用戶(hù)友好
? ? ? return XXXX
? ? def __repr__(self):? #逐样,使用print才觸發(fā),有__str__則用__str__,向開(kāi)發(fā)者友好
? ? ? ? return XXXX
int1=C(10)
int2=C(5)
int1+int2? #有+號(hào)則觸發(fā)__add__
一般實(shí)例不能像函數(shù)調(diào)用打肝,如果要用則要用__call__方法
class C:
? ? def __init__(self,a):
? ? ? ? self.a=a
? ? def __call__(self,*args,**kwargs):
? ? ? ? ? return "hhhhhh"
a=C(1)
a() #調(diào)用實(shí)例則觸發(fā)__call__方法
__class__? 查看類(lèi)名
__base__? 查看繼承的父類(lèi)
__bases__? 查看繼承的全部父類(lèi)
__dict__? 查看全部屬性脂新,返回屬性和屬性值鍵值對(duì)形式
__doc__? 查看對(duì)象文檔,即類(lèi)中的注釋?zhuān)ㄓ靡?hào)注釋的部分)
__dir__? ? 查看全部屬性和方法
第十一章粗梭,描述器與裝飾器
00-定制屬性訪問(wèn)
查找:
hasattr(re, 'length')# 返回bool值争便,判斷re實(shí)例有沒(méi)有l(wèi)ength屬性getattr(re,? 'length')# 返回屬性值,觸發(fā)__getattr__方法b. __getattribute__('length') # 返回屬性值,調(diào)用存在屬性不觸發(fā)断医,不存在則觸發(fā)
增加和修改:
setattr(b, ‘length’, 6) #沒(méi)有返回值滞乙,對(duì)實(shí)例b的length屬性添加值6b.__setattr__('length', 5)
刪:
delattr(b, 'ccc')#沒(méi)有返回值b.__delattr__('bbb')del b
class Persons:? ? def __init__(self,name):? ? ? ? self.name=nametest=Persons()print(hasatter(test,"name")) #判斷test對(duì)象有沒(méi)有name屬性
01-new方法
__new__class Person:? ? def __new__(cls,*args,**kwargs):? ? ? ? ? print("XXXXXX")test=Person(10)? #先調(diào)用new方法鉴嗤,然后再是init方法,實(shí)例化就觸發(fā)
class Earth:? ? def __new__(cls):? ? ? ? ? if not hasattr(cls, 'instance'):? ? ? ? ? ? ? ? ? ? ? ? ? ? cls.instance = super().__new__(cls)? ? ? ? ? ? ? return cls.instance? ? ? ? ? ? ? def __init__(self):? ? ? ? ? ? ? ? ? self.name = 'earth'e = Earth()print(e, id(e))a = Earth()print(a, id(a))在上面的例子中斩启,我們可以看到兩個(gè)實(shí)例的ID是相同的意味著這兩個(gè)其實(shí)引用的是同一個(gè)實(shí)例,是一個(gè)實(shí)例的不同名字
02-描述器
用一個(gè)類(lèi)來(lái)管理另外一個(gè)“類(lèi)屬性”醉锅,用來(lái)控制另一個(gè)類(lèi)屬性的訪問(wèn)兔簇,修改和刪除
類(lèi)屬性:訪問(wèn) __get__
?? ? ? ? ? ? ? ? 賦值:__set__
?? ? ? ? ? ? ? ? 刪除:__deleter__
class MyAtrribute:? ? ? def __get__(self, instance, owner):? ? ? ? ? ? ? ? ? ? ? ? ? ? print('get')? ? ? def __set__(self, instance, value):? ? ? ? ? ? ? ? ? ? ? ? ? ? print('set')? ? ? def __delete__(self, instance):? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? print('del')class MyClass:? ? ? m = MyAtrribute()? ? ? ? ? ? def __del__(self):? ? ? ? ? ? print('instance delete')? ? ? ? ? ? c = MyClass()c.m? #觸發(fā)__get__c.m = 1? #觸發(fā)__set__del c.m? #刪除__delete__這類(lèi)里面實(shí)例化另一個(gè)類(lèi),對(duì)這個(gè)實(shí)例做訪問(wèn)時(shí)硬耍,需要定義? __get__? __set__? __delete__? 方法
03-裝飾器
在不改變函數(shù)里代碼的情況下給它添加新的功能
下面這里實(shí)現(xiàn)了給函數(shù)添加新功能
類(lèi)也可以做裝飾器垄琐,但是需要定義 call 方法
04-常用內(nèi)置裝飾器