2010-08-29 3 views
0

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

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

Моя попытка упрощена и показана ниже, в основном я построил класс для этого объекта, содержащий несколько значений, а затем попытался создать список для размещения объектов - он ничуть не удался!

Любые предложения были бы весьма полезными.

class TagData(object): 
    def __init__(self): 
     self.tag = [] 
     self.val = [] 
     self.rel = [] 
     self.database = [] 
     self.description = [] 

tagvalue='xxx' 
tagList=[] 
tagList.append(TagData.tag(tagvalue)) 
tagList.append(TagData.val(val1)) 

В настоящее время я получаю сообщение об ошибке говорящего TagData не имеет атрибута «метки»

Спасибо,

+0

Ваш отступ выглядит неправильно. Неужели он был измучен, когда вы его разместили? В противном случае я не вижу, как это может даже работать на интерпретаторе. – MAK

ответ

1

Во-первых, вам нужно создать экземпляр TagData, как это:

TagData() 

Вот почему вы получаете AttributeError, потому что при использовании TagData.tag (...), вы на самом деле пытаясь вызвать метод тега объекта класса TagData, вместо того, чтобы устанавливать свойство определенного экземпляра.

Затем вам необходимо назначить свойство или создать способ его установки.Например, вы можете добавить метод, как это к классу:

def addVal(self,value): 
    self.val.append(value) 

А потом:

a=TagData() 
a.addVal('value') 
tagList.append(a) 

Или вы могли бы сделать это (если вы не хотите, чтобы определить геттеры/сеттеры):

a=TagData() 
a.val.append('text') 
tagList.append(a) 

не делать все, что на одной линии, потому что, когда вы звоните addVal, он будет возвращать None - и тогда вы не будете добавлять None в список вместо вашего объекта.

+0

Спасибо всем за их комментарии - я добавил addVal в класс и сделал несколько других изменений, и он отлично работает! – anthr

0

[] объявляет список, так что ваш переменные членов тега, Вэла, отно и т.д., все значения списка , но похоже, что они действительно хотят быть скалярами? Так попробуйте это в конструкторе:

def __init__(self): 
    self.tag = None 
    self.val = None 
    # etc 

Тогда вы могли бы сделать что-то вроде этого, чтобы создать объекты:

td = TagData() 
td.tag = tagvalue 
td.val = 'foo' 
tagList.append(td) 

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

def __init__(self, tag=None, val=None): 
    self.tag = tag 
    self.val = val 
    # etc 

Тогда:

tagList.append(TagData(tag=tagvalue)) 
tagList.append(TagData(val='foo')) 
0

Непосредственная проблема заключается в том, что вы не инстанцировании TagData. Атрибутами внутри __init__ являются экземпляры атрибуты (обратите внимание на префикс self., используемый для их установки для экземпляра), а не атрибуты класса. Попробуйте использовать тот же код с экземпляром TagData, созданным таким образом: TagData()

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

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