2017-09-22 63 views
0

這裏是我的代碼Python:對象可以添加或編輯其「兄弟」的值嗎?

import json 


class Father(object): 
    data = {} 

    def set_name(self, name): 
     self.data['name'] = name 

    def dump_data(self): 
     print(json.dumps(self.data)) 

class Brother(Father): 

    def __init__(self, name, number_of_cars): 
     self.set_name(name) 
     self.set_number_of_cars(number_of_cars) 

    def set_number_of_cars(self, n): 
     self.data['number_of_cars'] = n 

class Sister(Father): 

    def __init__(self, name, number_of_dolls): 
     self.set_name(name) 
     self.set_number_of_dolls(number_of_dolls) 

    def set_number_of_dolls(self, n): 
     self.data['number_of_dolls'] = n 


child = Brother('Brother John', 5) 
child.dump_data() 
child = Sister('Sister Jane', 30) 
child.dump_data() 

我所期待的是

{"name": "Brother John", "number_of_cars": 5} 
{"name": "Sister Jane", "number_of_dolls": 30} 

但是,結果是

{"name": "Brother John", "number_of_cars": 5} 
{"number_of_dolls": 30, "name": "Sister Jane", "number_of_cars": 5} 

而結果仍然是相同的,如果我改變這樣

child1 = Sister('Sister Jane', 30) 
child1.dump_data() 

我不知道爲什麼會發生這個問題。我以爲因爲我用Father類的data屬性和data是字典(python中的可變類型),但我有2個不同類的2個不同的對象(從一個Father類繼承),所以這個想法對我沒有意義。其中number_of_cars元素? 這個問題發生在Python 2.7.6和Python 3.4.3上。

請解釋爲什麼會發生這種情況!謝謝!

+1

'data'是一個類屬性,而不是一個實例屬性。因此,該類的所有實例都共享相同的屬性。 – Barmar

+1

你需要''父'''__init__'方法''self.data = {}'所以每個實例都有它自己的。 – Barmar

+0

除非這裏的命名有點誤導 - 這裏繼承的使用很奇怪......一個'兄弟'/'姐妹'並不是真的'父親'......他們*有一個'父親'* ...你可能想在OOP和繼承之前進行更深入的研究 –

回答

2

問題是,您正在初始化data作爲類屬性,而不是實例屬性。

您必須將data = {}改爲Father.__init__(),並將其作爲self.data = {}

import json 


class Father(object): 
    def __init__(self): 
     self.data = {} 

    def set_name(self, name): 
     self.data['name'] = name 

    def dump_data(self): 
     print(json.dumps(self.data)) 


class Brother(Father): 
    def __init__(self, name, number_of_cars): 
     super(Brother, self).__init__() 
     self.set_name(name) 
     self.set_number_of_cars(number_of_cars) 

    def set_number_of_cars(self, n): 
     self.data['number_of_cars'] = n 


class Sister(Father): 
    def __init__(self, name, number_of_dolls): 
     super(Sister, self).__init__() 
     self.set_name(name) 
     self.set_number_of_dolls(number_of_dolls) 

    def set_number_of_dolls(self, n): 
     self.data['number_of_dolls'] = n 


child = Brother('Brother John', 5) 
child.dump_data() 
child = Sister('Sister Jane', 30) 
child.dump_data() 

,你會得到預期的結果:

​​