2016-01-04 5 views
0

Возможно ли это в Python (2.7) обновить атрибут списка в производном конструкторе?Обновление атрибута списка в дочернем классе

Рассмотрим следующий пример:

class Parent(object): 
    def __init__(self, data): 
     self.data = data 
     value1  = 'P1' 
     self.value2 = 'P2' 
     self.parentList= [value1, self.value2] 

Мой parentList инициализируется как: ['P1', 'P2'].
Я хочу, чтобы мой конструктор класса Child обновил одно из значений, хранящихся в parentList.

class Child(Parent): 
    def __init__(self, data): 
     Parent.__init__(self, data) 
     value3 = 'C3' 
     value4 = 'C4' 
     #how update parentList? 
     self.childList = [value3, value4, ???] 

Ожидаемое поведение является обновлениеvalue2 получить childList, как показано ниже:
childList= ['C3','C4', 'P1, 'P2_modified']

Если возможно, это должно решаться на уровне «класса» еще потому будет множественное наследование идя ниже.

ответ

0

В Python не так много модификаторов доступа. Когда у вас есть дочерний объект, вы сможете получить доступ к родительским атрибутам по своему усмотрению. Например:

~/Desktop> cat a.py 
class P(object): 
    def __init__(self): 
     self.l = [1, 2] 

class C(P): 
    def __init__(self): 
     P.__init__(self) 
     self.l[1] = "2mod" 
     self.l.append(3) 

print C().l 
~/Desktop> python a.py 
[1, '2mod', 3] 

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

+0

Использование словарей было бы в порядке, я на сцене, что это может быть реализовано hoverwer. Мне действительно нужна упорядоченная коллекция. Я думал о OrderedDict, но не совсем уверен, если это возможно в моем случае. –

+0

Возможно, что-то похожее на «LinkedHashMap» Java? – Vlad

0

Я не совсем понимаю, чего вы пытаетесь достичь.

См. Комментарии в некоторых примерах того, что вы можете сделать с структурами данных, которые вы показали.

class Child(Parent): 
    def __init__(self, data): 
     Parent.__init__(self, data) 
     value3 = 'C3' 
     value4 = 'C4' 

     # You can change 'self.value2' by assigning to it: 
     self.value2 = 'P2_modified' 

     # You can create this new list with the value: 
     self.childList = [value3, value4, self.parentList[0], self.value2] 

     # You can also modify the existing list object: 
     self.parentList[1] = self.value2 
Смежные вопросы