关于私有化问题

2016-06-21 18:10:40 +08:00
 sudo987

很简单的一段代码,觉得基类的同名方法应该会被子类覆盖,但是并没有,求解。

class P(object):
    def __f(self):
        print 'i am P'
    f = __f
    def __init__(self):
        self.f()

class C(P):
    def _P__f(self):
        print 'i am C'

c = C() # i am P
3772 次点击
所在节点    Python
27 条回复
GreatMartial
2016-06-21 18:21:24 +08:00
小白一枚,昨晚刚看继承与包含,
https://flyouting.gitbooks.io/learn-python-the-hard-way-cn/content/learn-python-the-hard-way-exercise44.html
你看一下,能否解决你的问题。
hitmanx
2016-06-21 18:24:31 +08:00
f = __f 估计在第一次 evaluate class P 时就被赋值了,不会在后来初始化 class C 时再更改了。

你可以把 f = __f 去掉,然后在 P.__init__()里直接调用__f()试试
9hills
2016-06-21 18:25:09 +08:00
C 和 P 有同名方法么?没看到啊?
sudo987
2016-06-21 18:25:29 +08:00
@GreatMartial 直接说问题在哪儿不好么?
sudo987
2016-06-21 18:26:58 +08:00
@9hills 基类中的__f()由于私有化其实是_P__f(),子类有同名方法
kier
2016-06-21 18:29:50 +08:00
@sudo987 你这有点想当然啊,又不是外部调用,直接方法调用方法,哪还需要考虑私有?
sudo987
2016-06-21 18:29:55 +08:00
@hitmanx 谢谢回复,那肯定可以,不想靠猜测,想要求解。
sudo987
2016-06-21 18:30:59 +08:00
@kier 官方文档看到这种例子,不解,于是求问。
kier
2016-06-21 18:32:45 +08:00
@sudo987 麻烦吧官方链接发出来看看?
9hills
2016-06-21 18:34:52 +08:00
@sudo987 Python 什么时候多了这种 Magic 。。给个文档我看看
9hills
2016-06-21 18:35:45 +08:00
另外 Python 是没有私有方法的,所有方法都是 Public 的,你再怎么加下划线也没用。。。
kier
2016-06-21 18:37:05 +08:00
python 没有严格意义的私有方法,只是在__开头的方法,在外部调用的时候,要改下名调用,但是如果是方法调方法,不需要改名的
sudo987
2016-06-21 18:38:23 +08:00
@9hills 求解什么叫私有化?
sudo987
2016-06-21 18:40:10 +08:00
严不严格无所谓,我只是不明白这段代码的输出为什么会这样,求解。
sudo987
2016-06-21 18:41:39 +08:00
hitmanx
2016-06-21 18:42:41 +08:00
@sudo987

class P(object):
def __f(self):
print('i am base')

def __init__(self):
self.__f()

class C(P):
def _P__f(self):
print('i am derived')

c = C() # i am P


输出为 i am derived
kier
2016-06-21 18:43:43 +08:00
你再 init 里面调用的是 self.f(),又不是 self.__f(),那肯定是执行 print 'i am P'啦
9hills
2016-06-21 18:44:39 +08:00
@sudo987 你的标题你问我?

文档里写的很明白:“ Private ” instance variables that cannot be accessed except from inside an object don ’ t exist in Python.

而且也没有你这种用法。。。下划线没有任何 Magic 和语法含义在里面,你仔细看就明白了
sudo987
2016-06-21 18:46:14 +08:00
@hitmanx 自己试过,这种方法可以输出想要的结果,不明白加上 f = __f 后为什么结果不是想要的。
kier
2016-06-21 18:52:53 +08:00
>>> def a():
... print 'a'
...
>>>
>>> b = a
>>> def a():
... print 'new a'
...
>>> a()
new a
>>> b()
a
@sudo987 这个你能理解不?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287357

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX