在字典中创建类 - 值在类之间重复?

时间:2015-09-17 15:38:47

标签: python class dictionary

所以我试图将一些列表存储到一个属于" person"的列表中。我尝试用一​​些类来做这个:

class data():
    # Contains list of x, y, z, time lists
    x = []
    y = []
    z = []
    time = []

class data_main():
    # Contains data for each Pi
    data_plot = data()
    data_overflow = data()

piList = ["Lui", "Wing"]    
rpi_data = {}

for pi in piList:
    rpi_data[pi] = data_main()


rpi_data["Lui"].data_plot.x = 10
rpi_data["Wing"].data_plot.x = 99

print(rpi_data["Lui"].data_plot.x)
print(rpi_data["Wing"].data_plot.x)

问题是,我实际上并不知道会有多少人。因此我想创建一个类的字典" data_main"属于不同的人。

当我尝试这样做时,控制台结果是:

99
99

当我更喜欢它时:分别为10和99。我在for循环中担心:

for pi in piList:
    rpi_data[pi] = data_main()

我真的只是在字典条目中指定data_main()的相同实例,而实际上我更喜欢独特的实例,这样他们每个人都可以拥有自己的值。

我如何实现这一目标?

编辑:我做了更多挖掘,结果发现data_plot对于data_main()的两个实例都指向同一个地址。我如何避免这种情况(即,每次初始化一个新的data_main()类时,我都会创建新的data_plot()和data_overflow()类?)

1 个答案:

答案 0 :(得分:4)

您的data_plotdata_overflow是类属性而非实例属性,因此它们在定义类时初始化,而不是在创建实例时初始化,并且它们在类的所有实例之间共享。您应该在__init__()方法中将它们创建为实例属性。示例 -

class data_main:
    def __init__(self):
        # Contains data for each Pi
        self.data_plot = data()
        self.data_overflow = data()

同样在你的data类中,其中的属性也是类属性,你也应该将它们作为实例属性。示例 -

class data:
    def __init__(self):
        # Contains list of x, y, z, time lists
        self.x = []
        self.y = []
        self.z = []
        self.time = []

最后,在data课程中,您首先将x定义为列表,然后将x rpi_data["Lui"].data_plot.x更改为一个数字,当您这样做时 -

rpi_data["Lui"].data_plot.x = 10         #or the 99 one.

如果您打算将号码附加到x列表,则应使用 -

rpi_data["Lui"].data_plot.x.append(10)