一、self是什麼,通常都說指對象自己,這樣說了沒了用,說了後仍是很難懂,由於這樣說了後,仍然徹底搞不清楚,何時變量前須要加self,何時不須要加self。html
形成不少人,已經怕了self,不停地測試,加self減self來測試代碼,或者乾脆不知道要不要self,全部變量前面一概加self,這樣就能瞎貓碰死老鼠了,但不弄清楚,長期這樣作法有點悲劇。java
二、因此不須要這麼去想self表明對象自己,換個思惟應該認爲self是全局變量,若是變量前面加了self,那麼在任何實例方法(非staticmethod和calssmethod)就均可以訪問這個變量了,若是沒有加self,只有在當前函數內部才能訪問這個變量。python
三、根據pep8,全部的加了self的變量,須要確保是在__init__中首次出現,這是由於和java不同,python沒有成員聲明,python一會兒很難知道有哪些成員變量,因此最好確保全部帶self前綴的變量是在__init__中首次出現。這條規則可使用pycahrm的靜態檢查來證明或者pylint工具來證實。session
四、重中之重就是前綴帶self的變量,就是在整個類的代碼塊裏面相似是做爲全局變量,這樣想後就不會出現不知道要不要self或者瞎全加self。函數
五、錯誤的例子就是這樣,好比unitetst用例裏面:工具
def test_login(self):post
self.url = xxx測試
self.resp = self.session.get(self.url)this
self.text = self.resp.texturl
self.status = self.resp.statuscode
要加這麼多self幹鳥。這些都是局部的,別的方法裏面不須要訪問這些變量,徹底是須要去掉這些self。
除了session屬性須要共用之外,其餘都要去掉,否則形成很大的誤導,會覺得這些變量也須要在其餘方法中去使用它。
六、叫this或者任何其餘的也能夠,可是self是pycharm自動補全出來的,不必再手動修改搞成this。
class A():
def __init__(self,x):
self.x = x
def show(this):
print(this.x)
A(1).show()
七、爲何不直接在類下面寫,而後使用類方法cls.xxx訪問,self和cls區別?
類屬性是全部實例共享一份,須要看狀況,須要多實例而且屬性互不干擾須要使用self,須要全部實例保持使用同一個屬性使用類屬性。
一個類的多個實例就至關於一個模塊的無限複製,但這些實例(僞模塊)的內部狀態(全局變量)是存在多份的,互不干擾的,這是使用面向對象很大的一個優勢。模塊和類的實例能夠比較,拿函數和類比區別,簡直是問得牛頭不對馬嘴的僞問題,就是問吃飯和人有什麼區別 嘴巴和人有什麼區別同樣,問人和豬有什麼區別才值得回答。
8.若是代碼沒有使用面向對象封裝,只是有class外殼,那就直接寫成函數好了,沒有slef的困擾。不然即便寫了class 類也是無效裝逼廢物類,這種類是怎麼樣的,須要怎麼改變成有效面向對象類,須要看面向對象四步走裏面的博客
。
上面說的是從思想上面怎麼判斷力一個類是否是無效廢物類,那麼從代碼層面如何判斷呢?很簡單吧全部類的方法上加上@classmethod,全部代碼還能正常直接運行,這種狀況下,除了須要做爲純工具類之外,9成9就是無效廢物類類,這種調用 類名 + 方法不如直接寫成 模塊 + 函數來調用。
貼一個無效廢物類,裏面沒有成員變量也沒有調用成員變量
就算是吧add方法和print_something方法換成靜態方法,稍微說得過去,若是類裏面沒有其餘方法和成員變量和實例方法,那也算無效裝逼廢物滑稽類。