有如下代碼:
class A(object):
def __init__(self):
print "A:",self
super(A,self).__init__()
def fun_A1(self):
print "fun_A1"
self._fun_A2()
def _fun_A2(self):
print "fun_A2"
class B(A):
def __init__(self):
print "B:",self
super(B,self).__init__()
def _fun_A2(self):
print "fun_B2"
ins = B()
ins.fun_A1()
B: <__main__.B object at 0x000000000267D470>
A: <__main__.B object at 0x000000000267D470>
fun_A1
fun_B2
可見在 A,B中的 self 爲同一對象。B 重寫了 A 的 _fun_A2 方法,實現了多態。
將上面的代碼稍微改一下,將函數以雙下劃線開頭命名。
class A(object):
def __init__(self):
print "A:",self
super(A,self).__init__()
def fun_A1(self):
print "fun_A1"
self.__fun_A2()
def __fun_A2(self):
print "fun_A2"
class B(A):
def __init__(self):
print "B:",self
super(B,self).__init__()
def __fun_A2(self):
print "fun_B2"
ins = B()
ins.fun_A1()
輸出爲:
B: <__main__.B object at 0x000000000269D470>
A: <__main__.B object at 0x000000000269D470>
fun_A1
fun_A2
爲什麼 __fun_A2 方法沒有被覆蓋呢?
這涉及到 python 中的私有成員函數。python 將以 “__” 開頭的方法當作私有方法。這類方法的存儲名稱並不是函數名本身,而是 _類名方法名。A 中 __fun_A2的存儲名稱爲 _A__fun_A2,B 中的爲_B__fun_A2。所以 類 A 中的 fun_A1 調用的實際上是 _A__fun_A2 函數。如果 A 中沒有 __fun_A2 方法定義,則會出現如下錯誤:
B: <__main__.B object at 0x0000000001CE7E80>
Traceback (most recent call last):
A: <__main__.B object at 0x0000000001CE7E80>
File "D:/��Ŀ/��������/sourcecode_official/beibei_cloud/beibei-cloud-config/src/test/test_cls.py", line 26, in <module>
fun_A1
ins.fun_A1()
File "D:/��Ŀ/��������/sourcecode_official/beibei_cloud/beibei-cloud-config/src/test/test_cls.py", line 9, in fun_A1
self.__fun_A2()
AttributeError: 'B' object has no attribute '_A__fun_A2'
可見,類的私有成員函數不能被子類複寫。