這幾天本菜鳥在學習數據結構與算法,學習數據結構與算法免不了要手動實現這些數據結構與算法。在用類定義這些對象的時候,發現總是出現帶有 _ ,__ 和__xx__ 的函數,一開始也沒怎麼在乎,想着這些也學過,可是今天仔細思考一下這些用法與區別,才發現已經忘的七七八八了,就這樣好奇心逼着我去找出他們的區別。閱讀了幾篇博客以後,本菜鳥知道了這三兄弟的區別。python
Python中是不存在真正的私有方法的,可是爲了實現相似於c++中的私有方法,因而就在類的方法或者屬性前加一個「_」,意味着該方法或者屬性就不該該被調用了。c++
class A(object):
def _test(self):
print("這個函數不該該經過_tset調用,而應該經過test調用")
def test(self):
return self._test()
a = A()
a._test()
a.test()
複製代碼
結果算法
這個函數不該該經過_tset調用,而應該經過test調用
這個函數不該該經過_tset調用,而應該經過test調用
複製代碼
由此可得,這個方法是能被調用的,但出於某種約定,咱們是通常不去調用的。數據結構
雙下劃線表示的是私有類型的變量,既然是私有了,那確定就不容許子類訪問了,只容許這個類(self)自身訪問。函數
class A(object):
def __test(self):
print("I am test in A")
def test(self):
return self.__test()
a = A()
a.test()
複製代碼
結果:學習
I am test in A
複製代碼
返回的結果是咱們預料之中的。spa
接着,咱們給A添加一個子類,並從新定義它的__test()方法。code
class B(A):
def __test(self):
print("I am test in B")
b = B()
b.test()
複製代碼
如今,結果是這樣的:對象
I am test in A
複製代碼
可見,子類B從新定義以後的__test()返回的依然是A類中的__method(),由此咱們能夠知道以「__"開頭的方法是不能被重寫的,只容許在內部使用博客
這種方法被稱爲magic methods(魔術方法),通常是系統定義名字,相似於__init__(),通常是給Python調用的。
class WrongMethod(object):
def __init__(self, n):
self.n = n
def __add__(self, other):
return self.n - other
def __sub__(self, other):
return self.n + other
def __str__(self):
return str(self.n)
num = WrongMethod(20)
print("num = ", num)
print("num + 10 = ", num + 10)
print("num - 10 = ", num - 10)
複製代碼
結果
num = 20
num + 10 = 10
num - 10 = 30
複製代碼
上面的例子就能比較好的提現出來,"__ xx __" 這種方法通常是Python調用的。