附加到文件并使用数组时出错

时间:2011-08-18 13:42:57

标签: python arrays append

我写了这段代码:

    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]?

谢谢你

3 个答案:

答案 0 :(得分:2)

您的__init__

中的内容已经无序
  def __init__(self, *component, **kwargs):

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

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

会工作吗?您需要linesname位于收集组件的*项之后。

在Python 2中,您不能在*之后拥有命名属性,因此您需要使用**kwargsget('name')以及get('lines')来自kwargs 1}}。

如果您不提供默认值,则

get只返回None,因此您将在此处获得self.name = None。如果要指定默认名称,可以执行

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

就像我为lines所做的那样。

答案 1 :(得分:1)

在第32行

中使用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个组件的系统,并将一个空列表作为行的“控制台”)