首页 > 解决方案 > 对象传递对象

问题描述

我是 python 新手,目前正在尝试使用旧模块来输出图形。下面的代码是从使用 rpy 设计标准加速度图表的模块中摘录的(不要查)。

我无法理解 Element 类和 Vector 类如何协同工作。

我一直在尝试将 a 元素对象传递给向量 get_elements 但我不确定这是否是我应该做的。

任何帮助,将不胜感激。谢谢!

class Element(object):
   """Base class for Chartshare vector elements."""
   def __init__(self, offset=0, value=0):
       self.offset=offset
       self.value=value
       self.text=''

   def setText(self, value):
       self.value=value

   def getText(self):
       return self.value

   text = property(getText, setText)

class Vector(object):
   """Base class for Chartshare Vectors."""
   def __init__(self, name='', color='black', linetype='o', symbol=1, clutter=0, start=0, end=140, continuous=False, debug=False):
       self.name=name
       self.color=color
       self.linetype=linetype
       self.symbol=symbol
       self.start=start
       self.end=end
       self.elements={}
       self.debug=debug
       self.continuous=continuous

       if not self.continuous:             
           for i in range(self.start, self.end+1):
               self.elements[i]='NaN'

   def getSymbol(self):
       return self._symbol

   def setSymbol(self, value):
       if (type(value) == int):
           if (value >= 0) and (value <= 18):
               self._symbol = value
           else:
               raise SymbolOutOfRange, "Symbol should be an integer between 0 and 18."
       elif (type(value) == str):
           try:
               self._symbol = value[0]
           except IndexError:
               self._symbol=1
       else:
           self._symbol = 1    

   symbol = property(getSymbol, setSymbol)


   def getLinetype(self):
       return self._linetype

   def setLinetype(self, value):
       if (value == 'p') or (value == 'o') or (value == 'l'):
           self._linetype = value
       else:
           raise InvalidLinetype, "Line type should be 'o', 'p', or 'l'"

   linetype = property(getLinetype, setLinetype)

   def get_elements(self):
       """Returns a list with the elements of a Vector."""
       retval = []
       for i in range(self.start, self.end+1):
           if (not self.continuous):
               retval.append(self.elements[i])
           else:
               if (self.elements[i] != 'NaN'):
                   retval.append(self.elements[i])
       return retval

   def get_offsets(self):
       """Returns a list of the offsets of a Vector."""
       retval = [] 
       for i in range(self.start, self.end+1):
           if (not self.continuous):
               retval.append(i)
           else:
               if (self.elements[i] == 'NaN'):
                   retval.append(i)
       return retval

   def to_xml(self, container=False):
       """Returns an xml representation of the Vector."""
       if (container == False):
           container = StringIO.StringIO()
       xml = XMLGenerator(container)
       attrs = {}
       attrs[u'name'] = u"%s" % self.name
       attrs[u'symbol'] = u"%s" % self.symbol
       attrs[u'linetype'] = u"%s" % self.linetype
       attrs[u'color'] = u"%s" % self.color
       xml.startElement(u'vector', attrs)
       for i in range(self.start, self.end+1):
           if (self.elements[i] != 'NaN'):
               attrs.clear()
               attrs[u'offset'] = u"%s" % i
               xml.startElement(u'element', attrs)
               xml.characters(u"%s" % self.elements[i])
               xml.endElement(u'element')
       xml.endElement(u'vector')

   def render(self):
       """Plots the current vector."""
       if (self.debug):
           print "Rendering Vector: %s" % self.name
           print self.elements

       r.points(x=range(self.start, self.end+1),
                y=self.elements,
                col=self.color,
                type=self.linetype,
                pch=self.symbol)
       if (self.debug):
           print "Finished rendering Vector: %s" % self.name

标签: pythonpython-2.7

解决方案


Vectorget_elements()不接受任何参数。嗯,从技术上讲确实如此。它需要self. self是语法糖,可以让你这样做:

vec = Vector()
vec.get_elements()

这相当于:

vec = Vector()
Vector.get_elements(vec)

由于get_elements()不接受任何参数,因此您无法传递a给它。略读代码,我没有看到set_elements()模拟。这意味着您必须直接修改向量元素的字典。

vec = Vector()
vec.elements[a] = ...
print(vec.get_elements())  # >>> [a,...]

推荐阅读