[問題] Python private method...

看板Python作者 (ㄆㄆ)時間12年前 (2013/05/19 23:01), 編輯推噓2(2031)
留言33則, 5人參與, 最新討論串1/2 (看更多)
請問一下python 的private到底是怎樣呢 粗淺搜尋了一下相關資料 提到 python class 以 __開頭宣告的 method會被視作private 不會被override 例如 class A: def __init__(self): print("A") self.__A() def __A(self): print("_A") class B(A): def __A(self): print("_B") b = B() #執行結果 #A #_A 問題來了... 那 __init__ 為什麼就可以被override呢... 謝謝... -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.162.41.161

05/19 23:04, , 1F
而且這時候沒辦法呼叫 b.__A() 會說method不存在
05/19 23:04, 1F
※ 編輯: EntHeEnd 來自: 1.162.84.204 (05/19 23:06)

05/19 23:07, , 2F
sorry我剛剛編輯文章好像不小心修到推文...
05/19 23:07, 2F

05/19 23:10, , 3F
orz好像用__宣告的 就沒辦法call 所以b.__A call不了正常
05/19 23:10, 3F

05/19 23:11, , 4F
沒辦法從外面call
05/19 23:11, 4F

05/19 23:13, , 5F
是_開頭不是__開頭 __開頭不是給你拿來自己命名用的
05/19 23:13, 5F

05/19 23:15, , 6F
05/19 23:15, 6F

05/19 23:20, , 7F
喔喔 我看看 謝謝
05/19 23:20, 7F

05/19 23:20, , 8F
感謝樓上的連結!
05/19 23:20, 8F

05/19 23:35, , 9F
看完之後 我試了 _開頭 其實還是能從外面access @@...
05/19 23:35, 9F

05/19 23:36, , 10F
__開頭 才比較像private... @@
05/19 23:36, 10F
※ 編輯: EntHeEnd 來自: 1.162.48.36 (05/19 23:36)

05/19 23:38, , 11F
但是網頁又說 不該用__來標記一個method是private...
05/19 23:38, 11F

05/19 23:38, , 12F
說__是用來避免method被override用的...
05/19 23:38, 12F

05/19 23:39, , 13F
可是_開頭 從class外面還是能夠call... 這樣...@@...
05/19 23:39, 13F

05/19 23:40, , 14F
是說只是標記讓programmer知道不該call但是還是能call嗎
05/19 23:40, 14F

05/19 23:44, , 15F
反而他說不該用來標記private的 __ work起來比較像...
05/19 23:44, 15F
※ 編輯: EntHeEnd 來自: 1.162.48.36 (05/19 23:44)

05/19 23:51, , 16F
想要保證一個method只有在該class裡面能被call用__宣告會
05/19 23:51, 16F

05/19 23:51, , 17F
有什麼問題嗎@@...
05/19 23:51, 17F

05/20 00:05, , 18F
1. 因為PEP8(Designing for inheritance章節) 2. 用了__
05/20 00:05, 18F

05/20 00:05, , 19F
也只是換個名字,不保證真的是 private。
05/20 00:05, 19F

05/20 00:11, , 20F
因為其實還是有辦法call嗎... 沒有"保證"private
05/20 00:11, 20F

05/20 00:13, , 21F
所以說雖然有"近似"的效果 但是沒有保證 設計目的也不是
05/20 00:13, 21F

05/20 00:13, , 22F
這個 所以不要這樣用@@?
05/20 00:13, 22F

05/20 18:17, , 23F
python 沒有真正的 private, 以單底線開頭是"慣例"
05/20 18:17, 23F

05/20 18:18, , 24F
告訴別人這個 function 理論上"不應該"被外面的 call
05/20 18:18, 24F

05/20 18:18, , 25F
但十幾上你硬要去 call 是可以的
05/20 18:18, 25F

05/20 18:19, , 26F
雙底線開頭,不含同時雙底線開頭結尾,是 class 繼承
05/20 18:19, 26F

05/20 18:19, , 27F
時,為了避免被 override 時使用, python 會替你改名
05/20 18:19, 27F

05/20 18:20, , 28F
成 _ClassName__MethodName 以避免被覆蓋
05/20 18:20, 28F

05/20 18:21, , 29F
所以表面上看起來外面 call 不到,實際上用改完後的名
05/20 18:21, 29F

05/20 18:21, , 30F
字還是可以 call
05/20 18:21, 30F

05/20 22:10, , 31F
了解 謝謝樓上^^
05/20 22:10, 31F

05/21 01:33, , 32F
用 _開頭命名,是告訴使用者你不該從外面call
05/21 01:33, 32F

05/21 01:33, , 33F
而不是限制使用者不能從外面call
05/21 01:33, 33F
文章代碼(AID): #1HcEavh5 (Python)
討論串 (同標題文章)
文章代碼(AID): #1HcEavh5 (Python)