這將是有爭議的一篇文章
Python中真的有私有化操作嗎?
這篇文章环壤,我們將會從這樣幾個方面進行講解
- 面向?qū)ο笊估矗倳龅椒庋b的概念,封裝就會涉及到私有化的概念郑现,Python中真的有私有化操作嗎湃崩?
- 面向?qū)ο螅灿欣^承的概念接箫,繼承就會涉及到私有化數(shù)據(jù)是否能被繼承的問題攒读,Python中能繼承"私有屬性/私有方法"嗎?
當然辛友,秉持以往的習慣薄扁,我們依然通過代碼和原理跟大家一起分析。
1. Python中私有化的由來
寫在前面废累,那是一段與世無爭的時光
Python的發(fā)展是受到當時ABC語言和C語言的影響邓梅,結合他們的優(yōu)勢而開發(fā)出來的一門動態(tài)類型語言,同時兼具面向過程開發(fā)和面向?qū)ο箝_發(fā)的優(yōu)點邑滨,針對不同類型的震放、不同規(guī)模的項目,可以有針對性的驼修、快捷的完成項目功能處理。隨著Python逐步拓展到行業(yè)中的各個方面诈铛,和其他純面向?qū)ο蟮母呒壵Z言之間的平行交叉越來越明顯乙各,于是乎出現(xiàn)了各種項目開發(fā)約束和規(guī)范。今天我們要說的私有化幢竹,就是其中的一種約束規(guī)范耳峦。
約定的私有化
項目中我們開發(fā)公共模塊的過程中,為了和其他語言一樣焕毫,能給某些特定的屬性添加合法的數(shù)據(jù)蹲坷,或者在處理過程中將某些業(yè)務的實現(xiàn)隱藏在內(nèi)部,通過公開方法完成合法訪問邑飒,出現(xiàn)了私有化的概念循签,這里的私有化是一種約定的私有化操作,在腳本程序疙咸、數(shù)據(jù)爬蟲以及自動化運維盛行的那些年县匠,大家約定了模塊中或者類型中使用了單個下劃線開頭的屬性或者方法,是當前模塊或者類型私有的屬性和方法,(約定)不允許模塊外部或者類型外部去使用它們乞旦。
"""
這是一個自定義模塊
"""
# 公開變量
info = "模塊中的變量數(shù)據(jù)贼穆,可以被其他模塊使用"
# 約定規(guī)范
_message = "模塊中的約定私有變量,僅限當前模塊中使用兰粉,(約定)不允許其他模塊使用"
class Example:
def __init__(self, param1, param2):
# 公共屬性故痊,可以在類型外部通過對象直接調(diào)用使用
self.param1 = param1
# 私有屬性,約定只在當前類型內(nèi)部使用玖姑,類型外部不讓使用
self._param2 = param2
def _private_method(self):
"""私有方法"""
print("當前類型內(nèi)部使用的方法愕秫,(約定)類型外部不可以訪問")
def public_method(self):
"""公共方法"""
print("外界可以通過類型的對象直接調(diào)用執(zhí)行,允許外界訪問")
但是這樣的約定客峭,很容易被團隊中的新成員破壞豫领,項目構建的規(guī)模越大,參與的人員越多舔琅,約定的項目規(guī)范在需求開發(fā)周期較為緊張的時候等恐,出現(xiàn)問題的幾率就非常大,參與過中大型項目開發(fā)的同胞們應該深有體會备蚓,尤其是那一個個趕需求的日日夜夜课蔬,等時過境遷再看曾經(jīng)寫的代碼,都是為了追求趕需求周期而寫的慘不忍睹的代碼郊尝!
語法強制私有化二跋?!
在項目開發(fā)過程中流昏,大家開始從語法層面探索私有化的解決方案扎即,于是有開發(fā)團隊開始使用一種新的語法格式來實現(xiàn)私有化方案:使用雙下劃線字符開頭的變量,這樣的變量確實在語法上實現(xiàn)了不能被外界直接訪問的目的况凉。
"""
私有化
語法私有化操作
"""
class Example:
"""案例類型"""
def __init__(self, name):
"""初始化屬性"""
self.__name = name
def __private_method(self):
"""私有方法"""
print("只能在類型中被訪問的方法..")
# 創(chuàng)建對象
example = Example("Python")
# 不能訪問“私有屬性”了
print(example.__name)
# AttributeError: 'Example' object has no attribute '__name'
# 不能執(zhí)行私有方法了
example.__private_method()
# AttributeError: 'Example' object has no attribute '__private_method'
但是這里要說的是谚鄙,某些團隊開始這么干,沒有正式項目組去這么操作刁绒,很多同事經(jīng)歷的公司開發(fā)中大型項目闷营,基本還是按照原始的單下劃線約定的方式,進行私有化約定處理知市,并且現(xiàn)在的公司有了項目代碼質(zhì)量檢查后傻盟,已經(jīng)規(guī)范了太多,以前項目開發(fā)不規(guī)范的問題嫂丙,已經(jīng)很少見了娘赴;但是不可否認的是,上述雙下劃線開頭的語法特征跟啤,在很多第三方工具模塊中就比較常見筝闹。
盡管不推薦媳叨,但是我們不反對這樣的語法習慣,前提是首先要符合項目組的開發(fā)規(guī)范关顷。這里需要強調(diào)的是:這樣真的就做到語法私有化了嗎糊秆?
Python真的有私有化嗎?
Python語法是從參考ABC語言和C語言的語法語義習慣议双,過度過來的一門高級編程語言痘番,吸收了面向?qū)ο蟾呒壵Z言的特性同時兼容快捷的面向過程的處理特征,語法中已經(jīng)具備了很多純面向?qū)ο笳Z言通過大量編碼才能實現(xiàn)的設計模式平痰,所以對于完全私有化的操作在語法層面并不支持汞舱,而是提倡數(shù)據(jù)可用性,因為軟件的目的就是為了解決問題而存在的宗雇,解決問題的核心就是處理數(shù)據(jù)昂芜,合理的處理數(shù)據(jù)才是最終的目的,在語法上通過私有化的操作有點花費太多資源和精力去作了和業(yè)務關系不大的事情赔蒲,而追求簡潔泌神、簡單、簡易的Python語法對此是比較抗拒的舞虱!