这肯定是初学者的问题,我只是在搜索它时遇到了麻烦。
我想要做的是计算圆圈上数千个圆圈的点数,我将在后面渲染。因为我将每秒渲染数千个圆圈,我想我会尽量避免不必要的开销。为此,我创建了一个函数来计算单位圆上的多个点(我想要变量,一个更大的圆将需要更多的点计算),另一个函数可以获取这些点,转换它们和然后按半径缩放。
我的原始代码最终结果如下:
class Circle():
...
def CalcCircle(segments):
does some stuff to calculate generic coordinates
def CreateCircle(x, y, r, segments):
does some stuff to create a circle using CalcCircle(segments)
显然问题是即使我可能只想创建包含20个段的圆圈,每次调用CreateCircle时我都会调用CalcCircle函数(并重复相同的计算)。
我能弄清楚如何解决这个问题的唯一方法是:
class Circle():
...
def CalcCircle(segments):
does some stuff to calculate generic coordinates
CreateCircle_has_not_been_run = True
def CreateCircle(x, y, r, segments):
if Circle.TransCircle_has_not_been_run:
generic_circle = Circle.CalcCircle(segments)
Circle.CreateCircle_has_not_been_run = False
does some stuff to create a circle using generic_circle
我从来没有正式学过编程所以我不确定这是否被认为是好的设计。当我每次想要“初始化”数据或仅在第一次运行时调用函数时,我必须制作一个随机类变量,这肯定会变得混乱。我问的原因是我经常遇到这个问题,所以我认为必须有一种标准的方法。
编辑:如何进行通话的示例。
@window.event
def on_draw():
window.clear()
width = window.get_size()[0]
height = window.get_size()[1]
radius = int(width/50)
segments = int(radius*1.5)
for i in range(N):
pyglet.gl.glColor3f(0.05,0.2,0.9)
DrawCircle(positions[i][0],positions[i][1],width,segments)
DrawCage(width,height)
DrawLabel(width,height)
etc.
我知道这里存在问题,但我只是想说明这个例子(如果有人想知道,位置来自更新功能)。正如我之前所说,这是我一直遇到的问题。
我可以根据Achim的建议从on_resize()函数调用Circle.CalcCircle()。我很难相信标准的做法是将两个随机函数粘贴到一个类中(因为它们都不一定需要甚至在Circle类中),其中一个隐式依赖于另一个,两者都是在代码的不同部分调用。
答案 0 :(得分:-1)
我会做这样的事情:
class Circle:
def __init__(self):
self.unit_circle_points = None
def CalcCircle(self, segments):
# Do some stuff to calculate segments,
# assign calculated values to class attribute
self.unit_circle_points = calculated_points
def CreateCircle(self, X, y, r, segments):
# If circle points have not yet been calculated then calculate
# and store, else just load stored points
if self.unit_circle_points is None:
self.CalcCircle(segments)
unit_circle_points = self.unit_circle_points
# Now use unit_circle_points to do some calculations
每次实例化一个圆形对象时,它都会附带一个名为unit_circle_points
的属性,该属性初始化为None
。当您第一次在该对象上调用CreateCircle
方法时,它会看到unit_circle_points
属性为None
并通过调用CalcCircle
执行必要的计算,并存储结果。在后续调用此CreateCircle
对象的Circle
方法时,unit_circle_points
属性将不再是None
,并且该方法将仅使用存储在属性中的值。< / p>
编辑:
如果这需要很多&#34;隐含&#34;根据您的口味行为,您可以改变方向,以便用户必须明确调用CalcCircle来生成预先计算的数据。
class Circle:
def __init__(self):
self.unit_circle_points = None
def CalcCircle(self, segments):
# Do some stuff to calculate segments,
# assign calculated values to class attribute
self.unit_circle_points = calculated_points
return self
def CreateCircle(self, X, y, r):
# If circle points have not yet been calculated then raise an error,
# else load previously calculated points
if self.unit_circle_points is None:
raise Exception("You'd better explicitly call CalcCircle first.")
unit_circle_points = self.unit_circle_points
# Now use unit_circle_points to do some calculations