2013-07-21 2 views
1

Так позволяет сказать, что у меня есть класс:Возможно ли обновить объект, инициализированный в суперклассе из подкласса?

class SuperClass(): 
    def __init__(self, number): 
     self._inputnumber = number 
     self._initallist = [] 

А потом я хочу построить подклассы этого класса, которые имеют методы, которые можно добавлять элементы в инициализирован список, чтение элементов из него, или удалять элементы из него. Например.

class SubClass(SuperClass): 
    def __init__(self, number, current_line, new_line): 
     self._number = number 
     self._thisline = current_line 
     self._gohere = new_line 
    def execute(self): 
     (SuperClass._initallist).append(self._thisline + 1) 

Это немного приблизительный пример того, что я пытаюсь сделать. Я хочу, чтобы мой первоначальный список был доступен для нескольких классов, чтобы они могли действовать на него, как показано выше. Однако, что происходит в моем случае, я получаю сообщение AttributeError о том, что мой SuperClass не имеет именованного атрибута.

AttributeError: type object 'SuperClass' has no attribute '_initiallist' 

Любые советы о том, как это сделать? Возможно ли это, или мне нужно сделать что-то еще для достижения этого результата?

ответ

0

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

Вы говорите, вы хотите, чтобы подклассы наследуют экземпляр атрибутом_initiallist и предоставить методы для его решения? Если это так, то экземпляры подклассов будут иметь атрибут _initiallist, но каждый _initiallist для каждого экземпляра класса будет другим.

В этом случае решение равно zhangyangyu описано.


«Я хочу быть в состоянии иметь свой первоначальный список доступных для нескольких классов, так что они оба могут действовать на него, как показано выше.»

Судя по названию, я мог бы интерпретировать это как: Я хочу, чтобы атрибут некоторых экземпляра суперкласса _initiallist быть доступны для экземпляров парочки подклассов, чтобы они могли все действует по тому же точный список ,

Вы можете сделать это, если _initiallist является атрибутом класса, или вы можете передать экземпляр суперкласса в качестве аргумента __init__ при создании экземпляра подкласса, насколько я знаю в настоящее время.

Кроме того, это означало бы, что два класса в вашем примере не имеют - это отношение, но ваш суперкласс действительно является обоюденным объектом (AFAIK).

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

class SharedObject(object): 

    def __init__(self, number): 
     self._inputnumber = number 
     self._initiallist = [] 


class Client(object): 

    def __init__(self, obj, current_line, new_line): 
     self._sharedobj = obj 
     self._thisline = current_line 
     self._gohere = new_line 

    def execute(self): 
     self._sharedobj._initiallist.append(self._thisline + 1) 
+0

Что такое obj в этом контексте? Это класс SharedObject? – user2560035

+0

Это экземпляр класса 'SharedObject'. Я должен был называть его «sharedobj» точно так же, как и атрибут. Занимает ли он вообще то, что вы пытаетесь сделать? – RussW

+0

В конце концов я закончил работу, я понял, что мне действительно не нужно наследование, и я могу просто передать объект SharedObject как бы в мой оператор execute в качестве параметра, а затем выполнить, чтобы он мог действовать на исходный список – user2560035

1

Вобще self._initiallist.append(self._thisline + 1)

+0

Я тоже пробовал это сделать. В этом случае я получаю еще один атрибут AttributeError, в котором у моего SubClass нет атрибута _initiallist. – user2560035

+0

Как вы инициализируете SuperClass/SubClass? –

2

_initallist является атрибутом экземпляра, вы не можете получить доступ к нему с помощью Super._initallist.

Я думаю, что вы хотите сделать, это ниже. Вам необходимо установить SuperClass в SubClass. И я думаю, что если это правильно есть-один отношение, там должно быть number в SubClass.

class SuperClass(): 
    def __init__(self, number): 
     self._inputnumber = number 
     self._initallist = [] 

class SubClass(SuperClass): 
    def __init__(self, number, current_line, new_line): 
     SuperClass.__init__(self, number) 
     self._thisline = current_line 
     self._gohere = new_line 
    def execute(self): 
     self._initallist.append(self._thisline + 1) 
+0

Это правильная основная идея, но лучшей альтернативой было бы использовать рекомендуемые классы нового стиля Python, написав «класс SuperClass (object):», а затем вызывать 'super (SubClass, self) .__ init __ (number)' from ' SubClass .__ init __() ' – martineau

+0

Да. Встроенный 'супер' - лучший метод. – zhangyangyu

+0

Вы правы в том, что это отношение is-one, и это почти работает, но, как сказал RussW, это дает мне новый экземпляр списка для каждого подкласса. Поэтому, когда я дважды вызываю метод, добавляя в конце заявление о печати для списка, он дает мне два списка с одним номером каждый, вместо того, чтобы иметь два элемента во второй раз. – user2560035

Смежные вопросы