芷江建設(shè)工程招投標網(wǎng)站b2b和b2c是什么意思
前情提要:小編面試,結(jié)果面試官著急去吃飯~又約了這次來面,不曉得又會問什么問題呢?
面試官大佬:小伙子來的挺準時的(贊賞的表情~),今天咱們接著聊哈,小伙子,你有對象了沒?
我:(心想難道面試官這么熱情,我要是沒有對象難道還要給我介紹一個?)托您的福,已經(jīng)有了。
面試官大佬:既然有對象了,那咱們今天就來聊聊對象那些個事兒吧!
我:(心中了然,原來是想要文面向?qū)ο?#xff0c;妥妥的沒問題)好的,您請說。
面試官大佬:Python是一門面向?qū)ο蟮恼Z言,你是怎么理解對象這個概念的呢?
我:面向?qū)ο笤趐ython中一直都有一個抽象的說法,就是一切皆對象,就我個人理解而言,對象就是一些數(shù)據(jù)和一些操作數(shù)據(jù)的方法的集合體,比如我們自定義一個類,那么這個類中就會有一些數(shù)據(jù)和方法,就像工具箱一樣,里面既有螺絲也有螺絲刀,共同組成了工具箱這個對象,螺絲就相當于數(shù)據(jù)而螺絲刀就是方法。
面試官大佬:你說說對象綁定定方法、靜態(tài)方法和類方法?
我:對象綁定方法是類實例化得到的對象可以直接調(diào)用的方法,會將實力當做第一個參數(shù)傳遞給該方法,如果是類調(diào)用這個方法就需要傳遞一個參數(shù),就是這個類的示例;類方法是classmethod
,是一個裝飾器,將類中定義的方法裝飾成為類方法,當調(diào)用類方法的時候就會將類當做第一個參數(shù)傳遞給該方法;靜態(tài)方法是staticmethod
,也是一個裝飾器,靜態(tài)方法就沒有任何自動傳遞參數(shù)的效果了,不管是類調(diào)用還是類實例化得到的對象調(diào)用都沒有自動傳參的效果,當不需要類和示例中的任何信息或者屬性的情況下可以考慮使用靜態(tài)方法。
面試官大佬:那你再說說反射。
我:在python中反射指的是通過字符串來操作對象的屬性,涉及到四個內(nèi)置函數(shù)的使用
getattr(obj, 'name') 獲取對象的屬性值
hasattr(obj, 'name') 判斷對象是否有某個屬性值
setattr(obj, 'name') 修改/增加對象的屬性值
delattr(obj, 'name') 刪除對象的屬性
通過使用反射就可以在事先不知道對象有什么屬性的情況下在程序中分析出對象的屬性。反射的底層原理就是先通過dir方法查看一個對象屬性,然后由__dict__
字典通過字符串反射到真正的屬性上,得到屬性值。
基于反射可以十分靈活的操作對象的屬性,比如說django中的CBV,利用反射的原理,視圖類里面書寫的get方法或者post方法會根據(jù)請求方式的不同自動調(diào)用。
面試官大佬:寫過元類嗎,或者了解元類嗎
我:(實話實說)在公司開發(fā)中沒有寫過元類,但是了解一些元類的原理。
面試官大佬:嗯嗯,沒事兒,那你就說說你知道的元類的一些原理或者知識。
我:類實例化產(chǎn)生對象,在python中類也是對象,而元類實例化就會得到類這個對象,class關(guān)鍵字定義的所有的類和內(nèi)置的類都是由元類type
實例化產(chǎn)生的。我們是可以通過控制調(diào)用類的步驟自定義元類,在調(diào)用在調(diào)用類的時候首先執(zhí)行的是類中的__new__
方法,該方法必須返回一個空對象,就是創(chuàng)建一個實例,如果沒有返回值在實例化對象的時候就不會運行類的__init__
方法,__init__
方法是初始化實例,為空對象設(shè)置初始值。如果想讓一個對象可以加括號調(diào)用,需要在該對象的類中添加一個__call__
方法,就是對象加括號可以調(diào)用是因為調(diào)用了產(chǎn)生這個對象的類中的__call__
方法。類加括號可以調(diào)用是調(diào)用了元類中的__call__
方法,元類中的__call__
方法會先調(diào)用類中的__new__
方法,再調(diào)用類中的__init__
方法,最后元類中的__call__
方法會返回一個初始化好的對象。
面試官大佬:原理掌握的不錯,元類大概就是這么回事,好了小伙子,你這對象找的不錯,面向?qū)ο缶拖鹊竭@,下次咱們再聊聊網(wǎng)絡(luò)和并發(fā)這塊。
我:好嘞~您走好