ошибка с добавлением в файл и использованием массива

1

Я написал этот код:

    class component(object):

      def __init__(self,
                   name = None,
                   height = None,                 
                   width = None):

        self.name = name        
        self.height = height
        self.width = width

class system(object):

      def __init__(self,
                   name = None,                 
                   lines = None,
                   *component):

        self.name = name
        self.component = component

        if lines is None:
                self.lines = []
        else:
                            self.lines = lines

      def writeTOFile(self,
                      *component):
        self.component = component

        line =" "
        self.lines.append(line)

        line= "#----------------------------------------- SYSTEM ---------------------------------------#" 
        self.lines.append(line)


Component1 = component ( name = 'C1',
                         height = 500,
                         width = 400)
Component2 = component ( name = 'C2',
                         height = 600,
                         width = 700)

system1 = system(Component1, Component2)
system1.writeTOFile(Component1, Component2)

и я получаю ошибку:

  Traceback (most recent call last):
  File "C:\Python27\Work\trial2.py", line 46, in <module>
    system1.writeTOFile(Component1, Component2)
  File "C:\Python27\Work\trial2.py", line 32, in writeTOFile
    self.lines.append(line)
AttributeError: 'component' object has no attribute 'append'

И я действительно не знаю, как это исправить.

Также есть способ определить мою систему1 как систему (компонент), где компонент = [Компонент1, Компонент2,... Компонент]?

Спасибо в adavance

Теги:
arrays
append

3 ответа

2
Лучший ответ

У вас есть что-то не в своем __init__:

  def __init__(self, *component, **kwargs):

    self.name = kwargs.get('name')
    self.component = component

    self.lines = kwargs.get('lines', [])

Будет работать. Вам нужны lines и name для элемента * который собирает компонент.

В Python 2 вы не можете иметь именованные атрибуты после *, поэтому вам нужно использовать **kwargs и get('name') и get('lines') из kwargs.

get just возвращает None если вы не self.name = None значение по умолчанию, поэтому вы получите self.name = None здесь. Если вы хотите указать имя по умолчанию, вы можете сделать

    self.name = kwargs.get('name', 'defaultname')

как я делал для lines.

  • 0
    Спасибо. Это сработало очень хорошо!
1

в строке 32 вы используете self.lines.append(line).

Но строки являются частью системы классов system инициализированной с помощью Component2, тип которой является component класса, который не имеет метода append.

  • 0
    Это не говорит ему, как решить проблему.
  • 0
    Вы правы, читая ваш ответ, я заметил, что его настоящей проблемой был порядок, и что Component2 не должен был быть lines . Мой ответ довольно бесполезен, извините
Показать ещё 1 комментарий
0

Проблема в том, что при определении system вы передаете Component1 в качестве аргумента line в конструкторе. Поскольку python выполняет все операции, которые он может выполнять, а не проверять типы аргументов, если операция может быть законной, это проходит.

Может быть, в конструкторе системы было бы неплохо проверить, действительно ли данные lines аргументов имеют список типов и, возможно, написано что-то вроде:

    if lines is None or not isinstance(lines, list):
            self.lines = []
    else:
            self.lines = lines

Таким образом, вы должны знать о проблеме, прежде чем пытаться добавить к объекту non-list.

А что касается второй части вашего вопроса, вы можете сделать это точно так же, как вы предложили:

system1 = system([Component1, Component2, MyComponent], [])

(если вы, например, хотите создать систему с тремя компонентами и пустой список в качестве "консоли" для строк)

  • 0
    Python отлично способен автоматически агрегировать список аргументов, и нет никакой причины передавать пустой список.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню