python什么時候加self,什么時候不加self


1、self是什么,一般都說指對象本身,這樣說了沒了用,說了后還是很難懂,因為這樣說了后,仍然完全搞不清楚,什么時候變量前需要加self,什么時候不需要加self。

造成很多人,已經怕了self,不停地測試,加self減self來測試代碼,或者干脆不知道要不要self,所有變量前面一律加self,這樣就能瞎貓碰死老鼠了,但不弄清楚,長期這樣做法有點悲劇。

 

2、所以不需要這么去想self代表對象本身,換個思維應該認為self是全局變量,如果變量前面加了self,那么在任何實例方法(非staticmethod和calssmethod)就都可以訪問這個變量了,如果沒有加self,只有在當前函數內部才能訪問這個變量。

 

3、根據pep8,所有的加了self的變量,需要確保是在__init__中首次出現,這是因為和java不一樣,python沒有成員聲明,python一下子很難知道有哪些成員變量,所以最好確保所有帶self前綴的變量是在__init__中首次出現。這條規則可以使用pycahrm的靜態檢查來證實或者pylint工具來證明。

 

 

4、重中之重就是前綴帶self的變量,就是在整個類的代碼塊里面類似是作為全局變量,這樣想后就不會出現不知道要不要self或者瞎全加self。

 

5、錯誤的例子就是這樣,比如unitetst用例里面:

def test_login(self):

     self.url = xxx

     self.resp = self.session.get(self.url)

     self.text = self.resp.text

     self.status = self.resp.statuscode

 

要加這么多self干鳥。這些都是局部的,別的方法里面不需要訪問這些變量,完全是需要去掉這些self。

 

除了session屬性需要共用以外,其他都要去掉,不然造成很大的誤導,會以為這些變量也需要在其他方法中去使用它。

 

6、叫this或者任何其他的也可以,但是self是pycharm自動補全出來的,沒必要再手動修改搞成this。

class A():
def __init__(self,x):
self.x = x

def show(this):
print(this.x)


A(1).show()


7、
為什么不直接在類下面寫,然后使用類方法cls.xxx訪問,self和cls區別?
類屬性是所有實例共享一份,需要看情況,需要多實例並且屬性互不干擾需要使用self,需要所有實例保持使用同一個屬性使用類屬性。
一個類的多個實例就相當於一個模塊的無限復制,但這些實例(偽模塊)的內部狀態(全局變量)是存在多份的,互不干擾的,這是使用面向對象很大的一個優點。模塊和類的實例可以比較,拿函數和類比區別,簡直是問得牛頭不對馬嘴的偽問題,就是問吃飯和人有什么區別 嘴巴和人有什么區別一樣,問人和豬有什么區別才值得回答。

8.如果代碼沒有使用面向對象封裝,只是有class外殼,那就直接寫成函數好了,沒有slef的困擾。否則即使寫了class 類也是無效裝逼廢物類,這種類是怎么樣的,需要怎么改變成有效面向對象類,需要看面向對象四步走里面的博客

關於pythoh面向過程開發人員三步轉面向對象的補充,再加一步,四步走戰略。轉面向對象也可以有固定公式。


上面說的是從思想上面怎么判斷力一個類是不是無效廢物類,那么從代碼層面如何判斷呢?很簡單吧所有類的方法上加上@classmethod,所有代碼還能正常直接運行,這種情況下,除了需要作為純工具類以外,9成9就是無效廢物類類,這種調用 類名 + 方法不如直接寫成 模塊 + 函數來調用。


貼一個無效廢物類,里面沒有成員變量也沒有調用成員變量

 

就算是吧add方法和print_something方法換成靜態方法,稍微說得過去,如果類里面沒有其他方法和成員變量和實例方法,那也算無效裝逼廢物滑稽類。

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM