传递对象的对象

时间:2019-08-13 14:47:25

标签: python python-2.7

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

我在理解Element类和Vector类如何协同工作时遇到了麻烦。

我一直试图将一个element对象传递给向量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

2 个答案:

答案 0 :(得分:0)

Vector的get_elements()不接受任何参数。好吧,从技术上讲。需要selfself是语法糖,可让您执行以下操作:

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,...]

答案 1 :(得分:0)

如我所见,在此代码中没有任何地方可以为self.elements分配来自函数的任何输入。您只是在初始化它或获取值

还请注意,.get_elements()函数没有任何参数(只有self,这是您要在其中调用的对象),因此当然不会起作用。

除非您可以执行以下操作,否则我们将需要更多代码来了解如何操作和连接这两个对象。

element_obj = Element()
vector_obj = Vector()

position = 4
vector_obj.elements[4] = element_obj

我得到以下答案:如我所见,Vector类中的elements属性是字典,当您调用vector_obj.get_elements()时,将使用开始和结束参数作为分隔符将其强制转换为数组

除非有其他遗漏,否则这是我可以想到的将元素添加到矢量对象中的唯一方法。另外,我们需要更多的代码或上下文来理解这些类之间的行为!

希望有帮助!