2014-09-20 2 views
0

이것은 초보자가하는 질문입니다. 검색하는 데 어려움이 있습니다.반복적으로 호출되는 함수의 데이터를 초기화하는 방법

내가 원하는 것은 나중에 렌더링 할 수천 개의 원이있는 원의 점을 계산하는 것입니다. 초당 수천 개의 서클을 렌더링 할 것이기 때문에 나는 불필요한 오버 헤드를 피하려고 노력할 것이라고 생각했습니다. 이를 위해 나는 단위 원에 점의 수를 계산하는 기능을 만들었습니다. (나는 더 큰 원이 더 많은 점을 계산할 필요가 있습니다.) 그리고이 점들을 취할 수있는 또 다른 기능을 번역했습니다. 그 다음 반경으로 축척합니다.

내 원래의 코드는 다음과 같이 결국 : 분명히

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 개 세그먼트, 나는 CalcCircle 함수를 호출 (그리고 반복 된 같은 계산으로 원을 만들 수 있습니다에도 불구하고) CreateCircle을 호출 할 때마다. 나는 이것이이었다 해결하는 방법을 알아낼 수

유일한 방법이이 좋은 디자인으로 간주되는 경우

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()을 호출 할 수 있습니다. 그러나 표준 연습은 클래스에 두 개의 무작위 함수를 사용하는 것이지만 (둘 다 서클 클래스에 있어야 할 필요는 없기 때문에), 그 중 하나는 내재적으로 다른 클래스에 종속되어 있으며 둘 다 코드의 다른 부분에서 호출됩니다.

+0

왜 'CalcCircle'을 호출하지 않고 결과를 저장하고 'CreateCircle'에 전달합니까? – Achim

+0

이 경우 CreateCircle은 16 밀리 초마다 렌더링되는 on_draw 함수에서 호출되기 때문에. 덧붙여서 on_draw에 1000 개의 키 사전을 전달할 때와 똑같은 문제가있었습니다. 나는 단지 값을 수정하기를 원한다. (그리고 나는 16 메가 바이트마다 1000 개의 키 사전을 다시 초기화한다면 메모리와 어떻게 작동하는지 모르겠다.) 결국 나는 피하려고하는 것을 전역으로 사용했다. . – user3573328

+0

더 일반적으로 데이터를 초기화하는 기능과 수정하는 기능이 표준적인 방식입니까? 저는 전 지구적인 국가를 가지고 단순히 그것을 수정하려는 마음에서 벗어나려고 노력하고 있습니다. 다소 의미가있는 경우 데이터를 계층 구조 위로 수정하는 기능을 가지고있는 것은 다소 불쾌감을줍니다. 또는 내가 좋은 디자인을 구성하는 것을 오해하고 있습니까? – user3573328

답변

-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 

당신이 None으로 초기화된다 unit_circle_points라는 이름의 속성이 올 것이다 원 개체를 인스턴스화 할 때마다. 해당 개체에 대해 CreateCircle 메서드를 처음 호출하면 unit_circle_points 특성이 None임을 확인하고 CalcCircle을 호출하여 필요한 계산을 수행하고 결과를 저장합니다. 이 Circle 개체의 CreateCircle 메서드에 대한 이후 호출에서 unit_circle_points 특성은 더 이상 None이 아니며 메서드는 단순히 특성에 저장된 값을 사용합니다.

편집 :이 당신의 취향에 대한 많은 "암시"행동을 요구하는 경우 그 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 
+0

이것이 내가하는 일이라고 생각합니다. 내가 가지고있는 것보다 훨씬 깔끔하고 인스턴스에서 메서드를 사용하는 것이 훨씬 더 많은 것처럼 보입니다. 하나의 클래스 함수가 ​​다른 클래스 함수의 데이터를 호출하는 것보다 명백합니다. 특히 큰 클래스가 될 수 있으며 코드의 매우 다른 위치에서 호출하는 경우가 많습니다. OOP에서 여전히 머리를 쓰고 있습니다. – user3573328

+0

이런 종류의 암시적인 부작용은 매우 나쁜 OO 프로그래밍이라고 생각합니다. – Achim

+0

와우 가혹한 것, 이것이 OP가 찾고 있던 정확한 기능을 제공하는 것 같습니다. 수정 된 버전을 확인하십시오. – DavidS

관련 문제