Составная и Иерархия без общих переменных экземпляра

Я написал хороший кусок кода, который сильно зависит как от наследования, так и от композиции. Теперь я столкнулся с проблемой, когда моим иерархическим классам нужны общие переменные для работы друг с другом, но это приводит к тому, что составные классы также используются совместно, а это означает, что мои отдельные экземпляры этих классов будут иметь общие значения там, где я не хочу их к. Я, очевидно, отстой в объяснении этого словами, поэтому я написал некоторый код.

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 ответа

Решение

Проблема исходит от 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

который дает желаемые результаты.

Одним из способов является добавление

self.variable3 = First()

в __init__ из Thirdтак что вы можете сохранить First а также Second без изменений и помешать этим значениям поделиться.

Другие вопросы по тегам