Python 基礎(chǔ)

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)置裝飾器

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市经柴,隨后出現(xiàn)的幾起案子狸窘,更是在濱河造成了極大的恐慌,老刑警劉巖坯认,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朦前,死亡現(xiàn)場(chǎng)離奇詭異介杆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)韭寸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荆隘,“玉大人恩伺,你說(shuō)我怎么就攤上這事∫埽” “怎么了晶渠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)燃观。 經(jīng)常有香客問(wèn)我褒脯,道長(zhǎng),這世上最難降的妖魔是什么缆毁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任番川,我火速辦了婚禮,結(jié)果婚禮上脊框,老公的妹妹穿的比我還像新娘颁督。我一直安慰自己,他們只是感情好浇雹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布沉御。 她就那樣靜靜地躺著,像睡著了一般昭灵。 火紅的嫁衣襯著肌膚如雪吠裆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,764評(píng)論 1 290
  • 那天烂完,我揣著相機(jī)與錄音试疙,去河邊找鬼。 笑死窜护,一個(gè)胖子當(dāng)著我的面吹牛效斑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柱徙,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼缓屠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了护侮?” 一聲冷哼從身側(cè)響起敌完,我...
    開(kāi)封第一講書(shū)人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎羊初,沒(méi)想到半個(gè)月后滨溉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體什湘,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年晦攒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闽撤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脯颜,死狀恐怖哟旗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情栋操,我是刑警寧澤闸餐,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站矾芙,受9級(jí)特大地震影響舍沙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剔宪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一拂铡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歼跟,春花似錦和媳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至骚秦,卻和暖如春她倘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背作箍。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工硬梁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胞得。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓荧止,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親阶剑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跃巡,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容