今天在測試的時候發現乙個很詭異的問題,語言描述不清楚,直接看**吧。為了測試各種可能性,我寫了兩種類繼承的**如下:
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
30
#!/usr/bin/python
#-*- coding: utf-8 -*-
importre
importsys
importos
importjson
import******json
classfoo(object):
_data = 1
def__init__(self,data):
self._data = data
defshowfoo(self):
print'foo',self._data
classbar(foo):
def__init__(self,data):
super(bar,self).__init__(data)
defshowbar(self):
#會報錯
#super(bar,self)._data = 3
#foo._data = 3
self.showfoo()
print'bar',self._data
print'bar',super(bar,self)._data
t = bar(2)
t.showbar()
執行結果如下:
foo 2bar 2
bar 1
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
#!/usr/bin/python
#-*- coding: utf-8 -*-
importre
importsys
importos
importjson
import******json
classfoo:
_data = 1
def__init__(self,data):
self._data = data
defshowfoo(self):
print'foo',self._data
classbar(foo):
def__init__(self,data):
foo.__init__(self,data)
defshowbar(self):
#會更改父親的資料
#foo._data = 3
self.showfoo()
print'bar',self._data
print'bar',foo._data
t = bar(2)
t.showbar()
執行結果如下:
foo 2bar 2
bar 1
不管是呼叫super(bar,self),或者直接用foo._data,獲取到的父類的_data欄位都是沒有經過改變的,即初始化的1,反而是直接通過self._data獲取的資料是經過改變的。由此可以推測出:
1
super(bar,self).__init__(data)
或者
1
foo.__init__(self,data)
改變的實際上是子類的資料,而並不是父類的資料。 但是到這裡還不夠,我們再把**中注釋掉的部分開啟,即:
1
#super(bar,self)._data = 3
和
1
#foo._data = 3
則兩份**的執行結果:
foo 2和traceback (most recent call last):
test.py|29| attributeerror: 'super' object has no attribute '_data'
foo 2bar 2
bar 3
可見沒有問題。於是我們可以有如下結論:
1.父類裡面的self._data 和 子類裡面的 self._data是同乙份資料
2.父類裡面的self._data 和 子類的super(bar,self)._data及foo._data是不一樣的
3.用super拿到的父類的資料是不可寫的,倒是直接用父類名來更改資料。foo._data的修改可以直接影響super(bar,self)._data的值。
好吧,到這裡我還是不想結束,我們用c++**來測試一下:
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
2829
3031
3233
3435
3637
3839
4041
4243
4445
4647
4849
#include
#include
#include
#include
using
namespace std;
class foo
foo(
int a)
int m_a;
void showfoo()}
;class bar :
public foo
void showbar()}
;int main(
int argc, const
char
*argv)
執行結果如下:
1010100
100100
200200
可見,對c++來說父類的m_a,子類的m_a,還有foo::m_a都是一樣的。
試驗資料,不對之處還請大家不吝賜教~
關於python和C 中子類繼承父類資料的問題
今天在測試的時候發現乙個很詭異的問題,語言描述不清楚,直接看 吧。為了測試各種可能性,我寫了兩種類繼承的 如下 123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 2829 30 usr bin python coding utf 8 im...
python中子類不能繼承父類的私有屬性和方法
在子類中是不能繼承私有屬性和方法的,但是私有屬性和方法可以在同乙個類中被呼叫 class person object def init self,name self.name name self.age 12 def greet self print hello,my name is s self....
C 中子類繼承和呼叫父類的建構函式方法
如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。構造原則如下 1.如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。2.如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執...