關於python和C 中子類繼承父類資料的問題

2021-08-26 22:00:51 字數 3889 閱讀 4570

今天在測試的時候發現乙個很詭異的問題,語言描述不清楚,直接看**吧。為了測試各種可能性,我寫了兩種類繼承的**如下:

123

4567

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 2

bar 2

bar 1

123

4567

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 2

bar 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 2

bar 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++**來測試一下:

123

4567

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)

執行結果如下:

10

10100

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.如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執...