作者EntHeEnd (ㄆㄆ)
看板Python
标题[问题] Python private method...
时间Sun May 19 23:01:11 2013
请问一下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
1F:→ EntHeEnd:而且这时候没办法呼叫 b.__A() 会说method不存在 05/19 23:04
※ 编辑: EntHeEnd 来自: 1.162.84.204 (05/19 23:06)
2F:→ EntHeEnd:sorry我刚刚编辑文章好像不小心修到推文... 05/19 23:07
3F:→ EntHeEnd:orz好像用__宣告的 就没办法call 所以b.__A call不了正常 05/19 23:10
4F:→ EntHeEnd:没办法从外面call 05/19 23:11
5F:推 legendmtg:是_开头不是__开头 __开头不是给你拿来自己命名用的 05/19 23:13
7F:→ EntHeEnd:喔喔 我看看 谢谢 05/19 23:20
8F:→ EntHeEnd:感谢楼上的连结! 05/19 23:20
9F:→ EntHeEnd:看完之後 我试了 _开头 其实还是能从外面access @@... 05/19 23:35
10F:→ EntHeEnd:__开头 才比较像private... @@ 05/19 23:36
※ 编辑: EntHeEnd 来自: 1.162.48.36 (05/19 23:36)
11F:→ EntHeEnd:但是网页又说 不该用__来标记一个method是private... 05/19 23:38
12F:→ EntHeEnd:说__是用来避免method被override用的... 05/19 23:38
13F:→ EntHeEnd:可是_开头 从class外面还是能够call... 这样...@@... 05/19 23:39
14F:→ EntHeEnd:是说只是标记让programmer知道不该call但是还是能call吗 05/19 23:40
15F:→ EntHeEnd:反而他说不该用来标记private的 __ work起来比较像... 05/19 23:44
※ 编辑: EntHeEnd 来自: 1.162.48.36 (05/19 23:44)
16F:→ EntHeEnd:想要保证一个method只有在该class里面能被call用__宣告会 05/19 23:51
17F:→ EntHeEnd:有什麽问题吗@@... 05/19 23:51
18F:推 ya790206:1. 因为PEP8(Designing for inheritance章节) 2. 用了__ 05/20 00:05
19F:→ ya790206:也只是换个名字,不保证真的是 private。 05/20 00:05
20F:→ EntHeEnd:因为其实还是有办法call吗... 没有"保证"private 05/20 00:11
21F:→ EntHeEnd:所以说虽然有"近似"的效果 但是没有保证 设计目的也不是 05/20 00:13
22F:→ EntHeEnd:这个 所以不要这样用@@? 05/20 00:13
23F:→ birdhackor:python 没有真正的 private, 以单底线开头是"惯例" 05/20 18:17
24F:→ birdhackor:告诉别人这个 function 理论上"不应该"被外面的 call 05/20 18:18
25F:→ birdhackor:但十几上你硬要去 call 是可以的 05/20 18:18
26F:→ birdhackor:双底线开头,不含同时双底线开头结尾,是 class 继承 05/20 18:19
27F:→ birdhackor:时,为了避免被 override 时使用, python 会替你改名 05/20 18:19
28F:→ birdhackor:成 _ClassName__MethodName 以避免被覆盖 05/20 18:20
29F:→ birdhackor:所以表面上看起来外面 call 不到,实际上用改完後的名 05/20 18:21
30F:→ birdhackor:字还是可以 call 05/20 18:21
31F:→ EntHeEnd:了解 谢谢楼上^^ 05/20 22:10
32F:→ mantour:用 _开头命名,是告诉使用者你不该从外面call 05/21 01:33
33F:→ mantour:而不是限制使用者不能从外面call 05/21 01:33