2012-07-20 3 views
-2

Я пишу код, который имеет два класса. Один класс создает текстовые элементы для трехмерной среды. Другие группируют их вместе в этой среде. То, что я пытаюсь сделать, это иметь экземпляры вызова второго класса первого класса. Другими словами, в def makeGroup я хочу иметь возможность вызвать экземпляр class msg. Как было бы сформулировано кодирование? В настоящее время первый класс наследуется ко второму, а затем я пытаюсь вызвать объект self.text, но я не знаю, как я должен обращаться к нему. Я не верю, что правильно использую наследование.Ссылка на экземпляр класса в другом классе

class msg: 
    def __init__(self,num,unit): 
     self.message = str(num) + ' ' + unit 
     self.num = num 
     self.text = viz.addText(self.message) 

class msgGroup(msg): 
    def __init__(self,x,y,z): 
     self.msgLs=[] 
     self.ghostMsg= viz.addText('',pos=[x,y,z],color= [0.000, .9, 0.071]) 
     self.msgLs.append(self.ghostMsg) 

    def makeGroup(self): 
     msg.text.setPosition([0,(len(self.msgLs)-1)*-1.5,0], viz.REL_PARENT) 
     self.msgLs.append(msg.text) 
+1

У Вас есть вопрос? В чем дело? См. Http://sscce.org/ и http://whathaveyoutried.com/ – Marcin

ответ

2

Пять вещей:

  1. Если это Python 2, ваш msg класс должен наследовать от object
  2. PEP8: Если вы не будете следовать этому, никто не будет в состоянии следовать код
  3. Если msgGroup наследует от msg, то у каждого msgGroup экземпляра также есть все члены (данные, методы и другие экзотические вещи), которые имеет экземпляр msg. В вашем методе makeGroup, чтобы обратиться к члену текущего текущего экземпляра text, просто сделайте self.text.
  4. Возможно, вы захотите, чтобы у каждого msgGroup было несколько msg. Чтобы сделать это, не использовать наследование, просто есть msgGroup есть список msg с, и итерацию над ней:

    for msg in self.msg_list: 
        print msg.text 
    
  5. Обращаясь к члену объекта или класса не называется «назвав его» , Вы вызываете функции, методы и другие вызовы (например, классы), используя оператор ().

    foo = self.makeGroup # assigning makeGroup to a variable 
    bar = self.makeGroup() # calling makeGroup, then assigning the result of that call to a variable 
    
+0

Если я создам список '' msg 's, то это еще не будет частью' class msg'? Есть ли другой способ сделать этот список, помимо помещения чего-то вроде 'list.append (self.text)' в конце функции? – user1496630

+0

Нет, список 'msg' будет в экземпляре класса 'msgGroup'. Если вы собрали все данные, которые вам нужны или можете получить его «на лету», существуют другие способы создания и добавления элементов в список, например 'msg_list + = [whatever]' или использование чего-то, обычно называемого пониманием списка , который представляет собой код, который будет создавать список в одном выражении. Более подробная информация о них содержится в [документации] (http://docs.python.org/reference/expressions.html?highlight=comprehension#list-displays). – martineau

+0

@martineau Как экземпляр 'msgGroup' содержит' msgs', если он не использует другую структуру данных? Вы сворачиваете свой собственный связанный список в свой собственный ответ - в этом ответе коллекции высокого уровня используют встроенные коллекции. – Marcin

2

Нет, вы действительно неправильно поняли наследство. Наследование - это когда класс B имеет все те же свойства, что и класс A, но имеет еще несколько, возможно, более конкретных: например, Человек - это Человек.

Ваш случай отличается: у вас есть группа, а группа имеет сообщения. Это композиция, а не наследование: «has-a», а не «is-a». Вы должны просто определить message_list внутри msgGroup и добавить к нему сообщения, затем вы можете перебирать сообщения и получать доступ к их атрибуту text.

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