沙師弟學Python之 _, __ 和 __xx__的區別

這幾天本菜鳥在學習數據結構與算法,學習數據結構與算法免不了要手動實現這些數據結構與算法。在用類定義這些對象的時候,發現總是出現帶有 _ ,__ 和__xx__ 的函數,一開始也沒怎麼在乎,想着這些也學過,可是今天仔細思考一下這些用法與區別,才發現已經忘的七七八八了,就這樣好奇心逼着我去找出他們的區別。閱讀了幾篇博客以後,本菜鳥知道了這三兄弟的區別。python

1. "_" 單下劃線

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調用
複製代碼

由此可得,這個方法是能被調用的,但出於某種約定,咱們是通常不去調用的。數據結構

2. 「__」 雙下劃線

雙下劃線表示的是私有類型的變量,既然是私有了,那確定就不容許子類訪問了,只容許這個類(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(),由此咱們能夠知道以「__"開頭的方法是不能被重寫的,只容許在內部使用博客

"__ xx __" 先後雙下劃線

這種方法被稱爲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調用的。

結論

  1. 」_「 是私有的,通常不該該被調用
  2. 」__「 是爲了不子類重寫某個函數而使用的
  3. 」__ xx __「 通常是用於Python調用
相關文章
相關標籤/搜索