Составная и Иерархия без общих переменных экземпляра
Я написал хороший кусок кода, который сильно зависит как от наследования, так и от композиции. Теперь я столкнулся с проблемой, когда моим иерархическим классам нужны общие переменные для работы друг с другом, но это приводит к тому, что составные классы также используются совместно, а это означает, что мои отдельные экземпляры этих классов будут иметь общие значения там, где я не хочу их к. Я, очевидно, отстой в объяснении этого словами, поэтому я написал некоторый код.
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
без изменений и помешать этим значениям поделиться.