我是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
答案 0 :(得分:0)
Vector的get_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,...]
答案 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()
时,将使用开始和结束参数作为分隔符将其强制转换为数组
除非有其他遗漏,否则这是我可以想到的将元素添加到矢量对象中的唯一方法。另外,我们需要更多的代码或上下文来理解这些类之间的行为!
希望有帮助!