Referenzen Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Referenzen Problem

Beitragvon sonium » Montag 5. Juni 2006, 14:24

Code: Alles auswählen

import pygame
from pygame.locals import *
pygame.init()

screen = pygame.display.set_mode((320, 240))
screen.fill((0,255,0))


square =  pygame.Surface((10,10))
square.fill((0,0,255))
rect = pygame.Rect((0,0),square.get_size())

screen.blit(square, rect)
pygame.display.flip()
clock = pygame.time.Clock()

interpolators = {}

class interpolator:
   def __init__(self):
      pass
   def update(self):
      pass
      
class int_pos(interpolator):
   def __init__(self, pos1, pos2, time):
      interpolator.__init__(self)
      self.time = time
      self.pos1 = pos1
      self.pos2 = pos2
      self.etime = 0.0
   def update(self):
      self.etime += clock.get_time()
      if self.etime > self.time:
         return None
      else:
         return self.pos1 * ((self.etime - self.time)/self.time) + self.pos2 * (self.etime/self.time)
      
      
def update_interpolators():
   a = []
   for i in interpolators:
      value = i.update()
      if value is not None:
         interpolators[i] = i.update()
      else:
         a.append(i)
   for i in a:
      del interpolators[i]

interpolators.update({int_pos(0, 100, 5000): rect.centerx})


while 1:
   clock.tick(20)
   update_interpolators()
   print rect.centerx
   screen.fill((0,255,0))
   screen.blit(square, rect)
   pygame.display.flip()


Also ich will ein Attribute mit einem Interpolator Objekt so verbinden, dass jedesmal wenn ich die update funktion des Objektes aufrufe das Attribute aktualisiert wird. Eigentlich dachte ich, dass das ganz einfach wäre, weil ja alles Referencen sind. Auf Attribute scheint das jedoch nicht zu zu treffen. Jednefalls ändert sicher der wert nicht.

Weiß jemand Abhilfe?
sonium
User
Beiträge: 66
Registriert: Mittwoch 27. Oktober 2004, 21:04

Beitragvon sonium » Montag 5. Juni 2006, 15:24

ok, hab schon ne lösung gefunden. Nämlich objekt und attribute voneinander trennen und erst bei bedarf per __setattr__ zusammensetzen.
BlackJack

Re: Referenzen Problem

Beitragvon BlackJack » Dienstag 6. Juni 2006, 06:57

sonium hat geschrieben:Also ich will ein Attribute mit einem Interpolator Objekt so verbinden, dass jedesmal wenn ich die update funktion des Objektes aufrufe das Attribute aktualisiert wird. Eigentlich dachte ich, dass das ganz einfach wäre, weil ja alles Referencen sind. Auf Attribute scheint das jedoch nicht zu zu treffen. Jednefalls ändert sicher der wert nicht.

Weiß jemand Abhilfe?


Wenn ich die Frage verstehen würde. Ausser `etime` veränderst Du kein Attribut. Funktioniert das nicht?

Ein paar Anmerkungen zum Quelltext:

Man sollte Funktionen immer so unabhängig wie möglich machen, also den Informationsfluss so gestalten das Informationen nur über die Parameter und den Rückgabewert hinein bzw. hinaus gelangen. So lässt sich das Programm viel einfacher verstehen und einzelne Funktionen isoliert testen. `update_interpolators()` könnte man zum Beispiel so schreiben und aufrufen:

Code: Alles auswählen

def update_interpolators(interpolators):
    result = dict()
    for interpolator in interpolators:
        value = interpolator.update()
        if value is not None:
            result[interpolator] = value
    return result

# ...

interpolators = update_interpolators(interpolators)


In Deiner Funktion wurde die `update()` Methode auf den Interpolator Objekten übrigens zweimal aufgerufen.

Und `i` als Schleifenvariable für etwas anderes als ganze Zahlen zu verwenden ist für viele Programmierer verwirrend, weil das die klassische Integer-Zählvariable ist.

Klassennamen bitte in "CamelCase" schreiben, also `IntPos`. Das ist Konvention bei Python und macht es einfacher Klassen von anderen Objekten zu unterscheiden.

Die `interpolator` Klasse brauchst Du übrigens nicht. Solange Du keine echte Funktionalität in einer Basisklasse hast, solltest Du sie weglassen.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder