python中單下划線(_)和雙下划線(__)的特殊用法


單下划線開頭(_)

  • 在模塊中使用單下划線開頭
    模塊中使用單下划線(_)開頭定義函數、全局變量和類不能被模塊外部以: from module import * 形式導入。
    但可以用:from module import _func 形式單獨導入。
    當然定義函數、全局變量和類前面有2個或者更多下划線開頭也不可以用 from module import * 的形式導入。
# 單下划線開頭的函數
def _my_abs(num):
    return 'my_abs:' + str(abs(num))

# 單下划線開頭的全局變量
_My_var

# 單下划線開頭的類
_My_Class:
    pass

  • 在類中使用單下划線開頭
    帶單下划線的類變量、實例變量和方法,允許類內部、類實例和子類訪問,不受限制。
    單下划線僅僅是一種私有申明約定,訪問不受限制。

雙下划線開頭(__)

  • 在class類的內部,帶雙下划線的類變量、實例變量、方法具有正常訪問權限。
  • 在繼承結構中,帶雙下划線的基類的類變量和實例變量不能被子類直接訪問。
  • 在實例中,帶雙下划線的類變量、實例變量、方法不能被直接訪問。但有辦法間接訪問。

雙下划線開頭的類變量、實例變量、方法在繼承和實例中可以間接訪問

雙下划線開頭的變量和方法替換為`單下划線+類名+雙下划線開頭的變量和方法`的形式,且雙下划線開頭的變量和方法后面最多只能以一個單下划線結束,否則也無法訪問。
class BaseCls:
    def __init__(self, name, age, nick_name):
        self.name = name
        self.__nick_name_ = nick_name  # __nick_name后面最多以一個_結束,否則通過基類名混淆的方式也無法訪問了。
        self.age = age


class SubCls(BaseCls):
    def __init__(self, name, age, addr, nick_name):
        super().__init__(name, age, nick_name)
        self.addr = addr
        self.a_nick_name = self._BaseCls__nick_name_ 


免責聲明!

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



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