Я написал этот код:
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
У вас есть что-то не в своем __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
.
в строке 32 вы используете self.lines.append(line)
.
Но строки являются частью системы классов system
инициализированной с помощью Component2
, тип которой является component
класса, который не имеет метода append
.
Component2
не должен был быть lines
. Мой ответ довольно бесполезен, извините
Проблема в том, что при определении 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], [])
(если вы, например, хотите создать систему с тремя компонентами и пустой список в качестве "консоли" для строк)