+ -
当前位置:首页 → 问答吧 → python 虚函数问题

python 虚函数问题

时间:2011-09-18

来源:互联网

我在父类定义了函数:

Python code

def __initIndexs(self):
    print 'root'       



子类重载它:
Python code

def __initIndexs(self):
    print 'leaf'       



父类中有一个函数 initialization ,调用了 self.__initIndexs 我发现这一点上和C++有很大不同
通过子类来调用 initialization 也是父类中的 initIndexs 被调用

希望有高手解答这是为什么(原理上),并且指点下我该怎么做?

作者: wwwwfly   发布时间: 2011-09-18

initialization 里面是一些通用的处理,我不想重载它。

我试过这样可以:

父类中:
Python code

def initialization(self):            
    self.indexs = self.__initIndexs()


子类:
Python code

 def initialization(self):               
     root.initialization(self)
     self.indexs = self.__initIndexs()   



这样倒也满足要求,但是我觉得肯定有更好的方法。

作者: wwwwfly   发布时间: 2011-09-18

看不懂在问什么。
说清楚你希望得到什么样的结果,你实际得到的是什么样的结果。

另外Python里没有什么虚函数什么重载,别使用C++里的术语,这会让读者觉得很困惑。

作者: iambic   发布时间: 2011-09-18

python里没有虚函数的概念。

必须明确调用的方法名是父类还是子类,如果不指定默认调用当前类。

作者: WaistCoat08   发布时间: 2011-09-18

是由于你用__前缀的缘故。python对以__开头的方法名会做特殊处理(name mangling),这样处理后父类中的__initIdex和子类中的__initIdex会有不同的函数名,就会被认为是两个不相干的函数。

用_前缀或者不用特殊前缀就行了。看下面的例子。

Python code

>>> class P:
...     def initialize(self):
...         self.dosomthing()
...     def dosomthing(self):
...         print "call from parent"
... class C(P):
...     def dosomthing(self):
...         print "call from child"
>>> c = C()
>>> c.initialize()
call from child
>>> class P_with_private:
...     def initialize(self):
...         self.__dosomthing()
...     def __dosomthing(self):
...         print "call from parent"
... class C2(P_with_private):
...     def __dosomthing(self):
...         print "call from child"
>>> c2 = C2()
>>> c2.initialize()
call from parent
>>> class P_with_hint:
...     def initialize(self):
...         self._dosomthing()
...     def _dosomthing(self):
...         print "call from parent"
... class C3(P_with_hint):
...     def _dosomthing(self):
...         print "call from child"
>>> c3 = C3()
>>> c3.initialize()
call from child
>>> 

作者: panghuhu250   发布时间: 2011-09-18

楼上代码很详细了,补充 :

python类的属性 只有 私有和共有两种
如果函数,方法或 属性的名字以两个下划线开始,表示私有类型,
没有使用两个下划线开头表示共有属性

类私有属性不能被类以外的函数调用

作者: CCDDR   发布时间: 2011-09-18

python PEP8 是这么说的
"
We don't use the term "private" here, since no attribute is really
  private in Python (without a generally unnecessary amount of work).
"



双下划实即上、前面还有 __class_name,这就是 name mangling
Python code

class P:
    def __init__(self):
        self.__dosomthing()

    def __dosomthing(self):
        print "call from parent"


class C(P):
    def __dosomthing(self):
        print "call from child"


print P.__dict__
print
print C.__dict__

# output
#{'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x7fbac8541578>, '_P__dosomthing': <function __dosomthing at 0x7fbac8547410>}

#{'_C__dosomthing': <function __dosomthing at 0x7fbac8547488>, '__module__': '__main__', '__doc__': None}





名字都转了,自然不知所谓, 
python class 没有私有

作者: notax   发布时间: 2011-09-18