没有实例共享变量的Composite和Hierarchy

时间:2014-01-07 13:56:18

标签: python python-2.7 hierarchy composition overlapping-instances

我写了大量代码,这些代码严重依赖于遗产和组合。现在我遇到了一个问题,我的层次结构类需要共享变量才能在彼此之间工作,但这会导致合成的类也被共享,这意味着我的这些类的单独实例将共享我不在的值# 39;不要他们。我显然很难用文字解释这个,所以我写了一些代码。

class First(object):
    def __init__(self):
        self.subvar1 = 0
        self.subvar2 = 10

class Second(object):
    variable3 = First()

class Third(Second):
    def __init__(self):
        self.variable4 = self.variable3.subvar2

Firstinstance = Third()
Secondinstance = Third()

Firstinstance.variable3.subvar1 = 50
Secondinstance.variable3.subvar2 = 0

print Firstinstance.variable3.subvar2 #<-prints 0 but i want 10
print Secondinstance.variable3.subvar1 #<-prints 50 but i want 0

除了转储层次结构系统并编写一个庞大的类,我可以阻止合成的类共享它们的价值之外,还有其他方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

一种方法是添加

self.variable3 = First()

进入__init__的{​​{1}},这样您就可以保持ThirdFirst不变,并防止共享这些值。

答案 1 :(得分:0)

问题来自Second.variable3是一个类属性 - 即由类的所有实例及其子类共享。你想要:

class Second(object):
    def __init__(self):
        self.variable3 = First()


class Third(Second):
    def __init__(self):
        super(Third, self).__init__()
        self.variable4 = self.variable3.subvar2

产生了预期的结果。