我写了这段代码:
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'
我真的不知道如何解决它。
还有一种方法可以将我的system1定义为system(Component),其中component = [Component1,Component2,... Componentn]?
谢谢你
答案 0 :(得分: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
1}}。
get
只返回None
,因此您将在此处获得self.name = None
。如果要指定默认名称,可以执行
self.name = kwargs.get('name', 'defaultname')
就像我为lines
所做的那样。
答案 1 :(得分:1)
中使用self.lines.append(line)
。
但是line是使用system
初始化的类Component2
的成员,该类型是没有方法component
的类append
。
答案 2 :(得分:0)
问题在于,在定义system
时,您在构造函数中将Component1
作为line
参数传递。由于python可以执行所有操作,如果操作可以合法完成,则不会检查参数类型,这会传递。
也许在系统构造函数中检查给定的参数lines
是否真的是类型列表,并且可能写出如下内容:
if lines is None or not isinstance(lines, list):
self.lines = []
else:
self.lines = lines
这样,你会在尝试追加到非列表对象之前知道之前的问题。
至于问题的第二部分,你可以像你建议的那样完成:
system1 = system([Component1, Component2, MyComponent], [])
(例如,如果您想制作一个包含3个组件的系统,并将一个空列表作为行的“控制台”)