精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網(wǎng)站建設(shè)資訊

NEWS

網(wǎng)站建設(shè)資訊

python封裝子函數(shù) python函數(shù)封裝與調(diào)用

python中什么是封裝?

“封裝”就是將抽象得到的數(shù)據(jù)和行為(或功能)相結(jié)合,形成一個有機(jī)的整體(即類);封裝的目的是增強(qiáng)安全性和簡化編程,使用者

站在用戶的角度思考問題,與客戶深入溝通,找到靖西網(wǎng)站設(shè)計與靖西網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務(wù)覆蓋靖西地區(qū)。

不必了解具體的實現(xiàn)細(xì)節(jié),而只是要通過外部接口,一特定的訪問權(quán)限來使用類的成員。而這些封裝數(shù)據(jù)的函數(shù)是和Student類本身是關(guān)聯(lián)起來的,我們稱之為類的方法。

python如何封裝函數(shù)

可以定義一個類,類里定義很多函數(shù)(主要用它做什么)或直接定義函數(shù)在一個py文件中

在另一個文件中導(dǎo)入這個那個py包,調(diào)用類和方法

就是封裝了

如何用Python封裝C語言的字符串處理函數(shù)

在C語言中,字符串處理是每天都要面對的問題。我們都知道C語言中其實并沒有一種原生的字符串類型,‘字符串’在C語言里只是一種特殊的以''結(jié)尾的字符數(shù)組。因此,如何將C語言與更高層次的Python語言在‘字符串’處理這個問題上對接是一個有難度的問題。所幸有swig這種強(qiáng)大的工具。

如何封裝一個函數(shù),它修改參數(shù)字符串的內(nèi)容

假如有這樣一個C語言的函數(shù),

!-- lang: cpp --

void FillZero(char* pc,size_t * piLen)

{

size_t i=0;

while(i++*piLen/2 )

*pc++ = '0';

*pc = 0;

*piLen = i+1;

}

這個函數(shù)的功能是把字符串變成n個0。不過我們更關(guān)注函數(shù)的形式。這樣的函數(shù),表面上看char* pc是函數(shù)的參數(shù),可是實際上它才是函數(shù)的返回值和執(zhí)行的結(jié)果。piLen這個參數(shù)既是pc的最大長度,也是新的字符串的長度。我們直接用python封裝,看看運行結(jié)果。

Type "help", "copyright", "credits" or "license" for more information.

import cchar

s='123456'

cchar.FillZero(s,6)

Traceback (most recent call last):

File "stdin", line 1, in module

TypeError: in method 'FillZero', argument 2 of type 'size_t *'

結(jié)果差強(qiáng)人意,不是我們想要得到的結(jié)果。函數(shù)的第二個參數(shù)為size_t* 我們很難用python來表示,而且python中也不存在既是輸入,也是輸出的參數(shù)。

swig有一個標(biāo)準(zhǔn)庫,其中有一個cstring.i文件就是用來解決C語言字符串類型的問題。

我們在.i文件中加入這樣幾行

!-- lang: cpp --

%include "cstring.i"

%cstring_output_withsize(char* pc,size_t* pi)

void FillZero(char* pc, size_t* pi);

然后運行看結(jié)果

Type "help", "copyright", "credits" or "license" for more information.

import cchar

cchar.FillZero(10)

'00000\x00'

s=cchar.FillZero(10)

print s

00000

我們看函數(shù)的變化。首先在python里, FillZero變成了只有一個參數(shù)的函數(shù)。然后函數(shù)的返回值變成了一個字符串。其實cstring_output_size其實是一個宏,通過這個宏的定義改變了函數(shù)的形式,直接在Python中得到我們想要的結(jié)果。

其實類似cstring_output_size的宏還有好幾個,我列舉一下:

cstring_output_allocate(char *s,free($1));

第一個參數(shù)是指向字符串地址的指針,第二個參數(shù)為釋放空間的方法。

大家考慮這一下這樣的函數(shù):

void foo(char* s)

{

s = (char*)malloc(10);

memcpy(s,"123456789",9);

}

s這個參數(shù)表面上看是輸入,實際上是函數(shù)真正的輸出。 函數(shù)中真正改變的東西是chars指向的字符串的值。而且char這個類型,

python或者其他腳本語言里應(yīng)該都沒有對應(yīng)的類型。那么我們用cstring_output_allocate將這個函數(shù)轉(zhuǎn)換成另外一個形式的python或者其他腳本語言的函數(shù)。轉(zhuǎn)換后的函數(shù)其實是這樣的,以python為例str

foo()。

!-- lang: cpp --

%module a

%include "cstring.i"

%{

void foo(char* s);

%}

%cstring_output_allocate(char *s, free(*$1));

void foo(char *s);

在python中的調(diào)用:

!-- lang: python --

import a

a.foo()

'123456789'

cstring_output_maxsize(char *path, int maxpath);

第一個參數(shù)也是可以改變的字符串首地址,第二個參數(shù)為字符串的最大長度。在Python中調(diào)用的時候,只有maxpath這個參數(shù),返回字符串。

cstring_output_allocate(char *s, free($1));

第一個參數(shù)為指向字符串首地址的指針,第二個參數(shù)為釋放指針的方法。這個宏主要是封裝一種直接在函數(shù)內(nèi)部malloc空間的函數(shù)。在Python中調(diào)用時沒有參數(shù),直接返回字符串。

cstring_output_allocate_size(char *s, int slen, free(*$1));

這個相當(dāng)于前面兩個函數(shù)的組合。在函數(shù)內(nèi)部malloc空間,然后將字符串長度通過slen返回。其實在調(diào)用的時候非常簡單,沒有參數(shù),直接返回字符串。

如何處理c++的std::string

std::string是C++標(biāo)準(zhǔn)類庫STL中常見的類。在平時工作中大家肯定是沒少用。在python中如何封裝std::string? swig提供了標(biāo)準(zhǔn)庫

例如函數(shù):

!-- lang: cpp --

string Repeat(const string s)

{

return s+s;

}

只要在swig中加入這樣幾行:

!-- lang: cpp --

%include "std_string.i"

using namespace std;

string Repeat(const string s);

運行結(jié)果:

Python 2.6.6 (r266:84292, Dec 27 2010, 00:02:40)

[GCC 4.4.5] on linux2

Type "help", "copyright", "credits" or "license" for more information.

import cchar

cchar.Repeat('123')

'123123'

使用起來很方便,但需要注意的是,假如函數(shù)的參數(shù)的內(nèi)容是可以被修改,就不能用這種方式封裝。

例如:

!-- lang: cpp --

void repeat(string s)

{

s+=s;

}

這樣的函數(shù)直接使用 'std_string.i' 就是無效的。遇到這種函數(shù),只能用C語言封裝成 void repeat(chars, int maxsize), 再用swig調(diào)用 'cstring_output_withsize' 這個宏再封裝一次了。

將下面Python代碼封裝成函數(shù)

Python:常用函數(shù)封裝:

def is_chinese(uchar):

"""判斷一個unicode是否是漢字"""

if uchar = u'\u4e00' and uchar=u'\u9fa5':

return True

else:

return False

def is_number(uchar):

"""判斷一個unicode是否是數(shù)字"""

if uchar = u'\u0030' and uchar=u'\u0039':

return True

else:

return False

def is_alphabet(uchar):

"""判斷一個unicode是否是英文字母"""

if (uchar = u'\u0041' and uchar=u'\u005a') or (uchar = u'\u0061' and uchar=u'\u007a'):

return True

else:

return False

def is_other(uchar):

"""判斷是否非漢字,數(shù)字和英文字符"""

if not (is_chinese(uchar) or is_number(uchar) or is_alphabet(uchar)):

return True

else:

return False

def B2Q(uchar):

"""半角轉(zhuǎn)全角"""

inside_code=ord(uchar)

if inside_code0x0020 or inside_code0x7e: #不是半角字符就返回原來的字符

return uchar

if inside_code==0x0020: #除了空格其他的全角半角的公式為:半角=全角-0xfee0

inside_code=0x3000

else:

inside_code+=0xfee0

return unichr(inside_code)

def Q2B(uchar):

"""全角轉(zhuǎn)半角"""

inside_code=ord(uchar)

if inside_code==0x3000:

inside_code=0x0020

else:

inside_code-=0xfee0

if inside_code0x0020 or inside_code0x7e: #轉(zhuǎn)完之后不是半角字符返回原來的字符

return uchar

return unichr(inside_code)

def stringQ2B(ustring):

"""把字符串全角轉(zhuǎn)半角"""

return "".join([Q2B(uchar) for uchar in ustring])

def uniform(ustring):

"""格式化字符串,完成全角轉(zhuǎn)半角,大寫轉(zhuǎn)小寫的工作"""

return stringQ2B(ustring).lower()

def string2List(ustring):

"""將ustring按照中文,字母,數(shù)字分開"""

retList=[]

utmp=[]

for uchar in ustring:

if is_other(uchar):

if len(utmp)==0:

continue

else:

retList.append("".join(utmp))

utmp=[]

else:

utmp.append(uchar)

if len(utmp)!=0:

retList.append("".join(utmp))

return retList

python怎么讀封裝函數(shù)

封裝其實分為兩個層面,但無論哪種層面的封裝,都要對外界提供好訪問你內(nèi)部隱藏內(nèi)容的接口(接口可以理解為入口,有了這個入口,使用者無需且不能夠直接訪問到內(nèi)部隱藏的細(xì)節(jié),只能走接口,并且我們可以在接口的實現(xiàn)上附加更多的處理邏輯,從而嚴(yán)格控制使用者的訪問)

第一個層面的封裝(什么都不用做):創(chuàng)建類和對象會分別創(chuàng)建二者的名稱空間,我們只能用類名.或者obj.的方式去訪問里面的名字,這本身就是一種封裝。print(m1.brand) #實例化對象(m1.)

print(motor_vehicle.tag) #類名(motor_vehicle.)

-------------輸出結(jié)果---------注意:對于這一層面的封裝(隱藏),類名.和實例名.就是訪問隱藏屬性的接口

第二個層面的封裝:類中把某些屬性和方法隱藏起來(或者說定義成私有的),只在類的內(nèi)部使用、外部無法訪問,或者留下少量接口(函數(shù))供外部訪問。

Python中私有化的方法也比較簡單,即在準(zhǔn)備私有化的屬性(包括方法、數(shù)據(jù))名字前面加兩個下劃線即可。

使用python簡單封裝selenium常用函數(shù)

年前走查腳本代碼時,發(fā)現(xiàn)大家對selenium功能都在重復(fù)造輪子,而且容易出現(xiàn)一些常見低級bug。于是在閑暇之余,封裝一些常用的selenium功能。

在某些網(wǎng)頁中,存在多個frame嵌套。而selenium提供的find_element函數(shù)只能在當(dāng)前frame中查找,不能切換到其他frame中,需要從最上級frame中逐步切換(當(dāng)然也可以指定xpath的絕對路徑,但是一般沒人這么做)。在我們寫代碼過程中,需要明確知道當(dāng)前frame位置和需要尋找元素的frame位置。在frame切換過程中,容易因為疏忽導(dǎo)致frame切換錯誤導(dǎo)致元素?zé)o法找到的bug。

頁面中分布的frame,可以理解為樹狀結(jié)構(gòu)。因此我們可以采用遞歸的方式, 沿著某條搜索路線frame節(jié)點,依次對樹中每個節(jié)點均做一次訪問。

我們以163網(wǎng)址上的登錄框為例:點擊登錄按鈕,彈出登錄iframe頁面。輸入框位置在iframe中,因此我們不能使用xpath獲取元素位置,需要進(jìn)入iframe中,然后獲取元素。

手動切換ifame可能會產(chǎn)生bug,因此需要一套自動切換和檢索frame的機(jī)制。具體代碼如下:

需要注意的是:如果頁面中多個frame中,存在相同的xpath元素。還是需要指定frame的路徑,否則會返回搜索到的第一個元素。

強(qiáng)制等待

直接調(diào)用系統(tǒng)time.sleep函數(shù),不管頁面加載情況一定會等待指定的時間, 即使元素已被加載 。

1.如果設(shè)置的時間較長,會浪費時間

2.如果設(shè)置的時間較短,元素可能沒有加載。

頁面中某元素如果未能立即加載,隱式等待告訴WebDriver需等待一定的時間,然后去查找元素。默認(rèn)不等待,隱式等待作用于整個WebDriver周期,只需設(shè)置一次即可。

1.在上文的find_element函數(shù)中,采用遞歸方式在所有frame尋找元素。若采用隱式等待,則在每個frame中都需要等待設(shè)定的時間,耗時非常長。

2.某些頁面我們想要的元素已經(jīng)加載完畢,但是部分其他資源未加載。隱式等待必須等待所有元素加載完畢,增加額外等待時間。

顯示等待一般作用于某一個元素,在設(shè)定的時間范圍內(nèi),默認(rèn)每間隔0.5秒查找元素。返回被加載的元素,若超過設(shè)定的時間范圍未能查找則報錯。顯示等待作為selenium常用的等待機(jī)制,我們來看下他的源碼和機(jī)制。

driver 注釋中解釋為WebDriver實例,但是代碼中并未有相關(guān)檢測,因此可以傳入任何對象

但是__repr__函數(shù)中使用到session_id屬性,如果需要顯示屬性或者轉(zhuǎn)為str對象,最好在driver對象中添加session_id屬性

在until函數(shù)中,我們可以看到driver對象傳入method函數(shù)。在計時結(jié)束前,在不斷循環(huán)執(zhí)行method函數(shù),如果method函數(shù)有正常返回值則退出循環(huán),否則報TimeoutException錯誤。

可以采用裝飾器對隱式等待進(jìn)行封裝,這樣代碼更加精簡

同樣的,采用裝飾器對其他常用的函數(shù)進(jìn)行封裝,例如強(qiáng)制等待、點擊、輸入文本等。

裝飾器雖然很方便,但也會產(chǎn)生一些麻煩。例如在find_element函數(shù)遞歸調(diào)用過程中,理應(yīng)只要執(zhí)行一次裝飾器函數(shù)。但因為裝飾器已經(jīng)裝飾完畢,導(dǎo)致每次遞歸都會執(zhí)行。例如強(qiáng)制等待的sleep函數(shù),如果遞歸次數(shù)越多等待時間越長。

解除裝飾器一般有兩種做法:一是約定參數(shù),當(dāng)遞歸第二次調(diào)用時則不生效。例如

這種方式實現(xiàn)簡單,容易理解。但是增加了參數(shù)限制,在fun函數(shù)中就不能使用first_sleep參數(shù)。

二是采用裝飾器采用wrapped實現(xiàn),通過訪問wrapped屬性獲得原始函數(shù)。例如

但是某一個函數(shù)被多個裝飾器裝飾時,需要遞歸解除裝飾器。例如

最后整體代碼如下

這次的封裝其實還存在很多問題

1.find_element函數(shù)不僅僅只是提供查找元素功能,還提供一些其他功能,因此叫element_operation更為合適。

2.find_element函數(shù)的參數(shù)過多,并且很多參數(shù)的使用并不在函數(shù)本身中,對代碼閱讀很不友好。

3.得小心避免參數(shù)重復(fù)問題,假設(shè)裝飾器sleep和裝飾器wait_time都使用time這個參數(shù),將無法區(qū)分具體是哪個函數(shù)使用。

4.不利于擴(kuò)展和維護(hù),當(dāng)功能過多時find_element的參數(shù)過于龐大。

如果只是簡單地封裝和使用,上面這種方式也能達(dá)到較好的效果。如果想進(jìn)一步封裝,建議采用鏈?zhǔn)秸{(diào)用方式,裝飾器輔助封裝。例如

這樣函數(shù)的擴(kuò)展性和可閱讀性有較大的提升


網(wǎng)頁標(biāo)題:python封裝子函數(shù) python函數(shù)封裝與調(diào)用
當(dāng)前路徑:http://m.jcarcd.cn/article/dooioei.html
主站蜘蛛池模板: 国产SM网站 | 欧美日韩国产高 | 国产台湾佬国产娱乐 | 无码毛片一区二 | 成人影视在线 | 国产日韩免费视 | 国产又粗又大 | 加勒比中文 | 精品亚洲欧 | 国产亚洲首页 | 另类图片 | 国产偷国 | 日本不卡| 日韩在线影院 | 国产不卡视频一 | 日韩新片在线观看网 | 韩国三级视频网站 | 国产成a人片在线 | 福利理论片 | 蜜桃在线观看 | 国产精选视频网 | 国产精品民宅 | 国产午夜福利电影h | 国产欧美一 | 91红桃视频 | 欧在线一二三四区 | 国内国外精品一区二 | 精品午夜日韩 | 成人国产在线 | 中文字幕亚洲激情 | 日韩一级DH电影 | 国产精选第一页 | 国产欧美一区二区精 | 午夜亚洲一区二区福 | 精品影视| 国产日韩欧 | 91最新九颜色精品 | 国产精品拍自在线 | 日本有码中文 | 国产精品自第 | 国产精品专区四季 |