关于私有化问题

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
3905 次点击
所在节点    Python
27 条回复
sudo987
2016-06-21 19:26:05 +08:00
自己搞明白了,这个问题跟私有化没有关系,换成普通名字问题依旧,问题出在实例化顺序上, f = __f 存在于基类,属于类变量,且执行时机早于父类的__init__()更早于基类的__init__(),所以其实 f 的指向已经固定了,就是父类的__f(),且在子类没有对 f 的赋值操作,所以,即使子类覆盖了父类的同名方法__f(), f 的指向早就固定在父类的__f()了,所以才有 i am P 的输出。只有 @hitmanx 说对了。
sudo987
2016-06-21 19:38:56 +08:00
说错了,更早于子类。
kier
2016-06-21 20:06:20 +08:00
其实在 python 里, function 跟数字,字符串是一样的
比如 a = 1; b = a; a =2; 这时 b 的取值是什么呢,相信你也能一样看出是 1 ,如果把 1,2 换成一个函数体呢?其实效果也是一样的, b 还是原来的函数,类方法也是同样的道理,改了 P.__f ,但是 P.f 还是原来的那个方法,并没有改变

由于看到 5 楼你的回复,被带偏了,就直接答到私有方法上面去了,但是后来我在 20 楼的回复,就是想表达这么个意思
好吧,下次我回答问题,一定好好看看题目!
sudo987
2016-06-21 20:52:23 +08:00
@kier 嗯嗯。
happywowwow
2016-06-21 21:39:23 +08:00
@9hills
p = P()
print dir(p)
print dir(c)
你可以看到['_P__f'......]
sudo987
2016-06-21 23:24:14 +08:00
@9hills 回答个问题跟放炮似的,回答的对也就不说什么了,况且你的回复跟我的问题完全不搭边,呵呵,“你的标题你问我?”,会说话么?你爱答不答,没人逼你,别在这儿影响我心情。
qian19876025
2016-06-22 09:44:16 +08:00
我晕 这标题 差点以为是 360 的人问私有化

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

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

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

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

© 2021 V2EX