2017-07-04 3 views
0

ich mit dem besten Weg, ich kämpfen, um die folgenden in Python zu implementieren:Python: Variablen-Klasse verwenden Überblick über alle Objekte zu halten

Ich habe eine Simulation, die eine Vielzahl von Formen erzeugt. Bei jedem Durchlauf des Simulationscodes werden neue Formen erzeugt, die aus neuen Linienobjekten bestehen, aber diese Objekte müssen über mehrere Durchläufe hinweg beständig sein.

Jede Zeile wird durch eine Polylinien-codierte Zeichenfolge beschrieben. Jedes Mal, wenn eine neue Zeile generiert wird, muss überprüft werden, ob die gleiche Zeile bereits existiert. Wenn dies der Fall ist, möchte ich das Original zurückgeben, wenn nicht, möchte ich ein neues erstellen.

Ich muss auch alle erstellten Objekte verfolgen, damit ich sie am Ende mehrerer Simulationsläufe zurückbekomme und sie an eine Datenbank senden kann.

Meine erste Herangehensweise ist es, den itertools.count Iterator als Klassenvariable zu verwenden und eine neue ID bei der Erstellung zu bekommen (ich muss sowohl die ID als auch den String aus Legacy-Gründen behalten).

class Line(object): 
    new_id = itertools.count(start=1).next 
    lines = [] 

    def __init__(self, coord_string): 
     self.coord_string = coord_string 
     self.id = Line.new_id() 
     Line.lines.append(self) 

    @staticmethod 
    def from_coord_string(coord_string): 
     lines = [l.coord_string for l in Line.lines] 
     try: 
      ind = lines.index(path) 
      return Line.links(ind) 
     except ValueError: 
      return Line(coord_string) 

Ich behalte auch alle erstellten Objekte in der a-Klasse-Variable. Auf diese Weise können Sie mich überprüfen, ob eine Zeile bereits erstellt wurde, oder einen einfachen Zugang zu allen von ihnen bekommen später, d.h .:

all_lines = Line.lines 
dump_to_db(all_lines) 

Was sind die Nachteile der Verwendung Klassenvariablen wie diese sind? Gibt es eine bessere oder effizientere Möglichkeit, dies zu implementieren?

+1

Sie sind grundsätzlich für das Objekt Pool Muster suchen. Es ist unklug, es als statische Methode für eine Klasse zu implementieren, da Sie Ihren Objekt-Pool niemals von Ihren Objekten trennen können. – Alexander

+0

Auch Ihre 'id'-Generation ist nicht threadsicher, also ist es durchaus möglich, dass sie endet mit 2o Objekten mit der gleichen Linie. – Alexander

Antwort

1

würde ich so etwas tun:

from itertools import * 
from multiprocessing import Lock 

class Line(object): 
    def __init__(self, ID, coord_string): 
     self.id = ID 
     self.coord_string = coord_string 

class LineFactory(object): 
    latestId = 0 
    idLock = Lock() 

    def __init__(self): 
     self.lines = {} # Dict mapping coord_string to Line objects 

    def make_new_id(self): 
     with self.idLock: 
      newId = self.latestId 
      self.latestId += 1 
     return newId 

    def new_line(self, coord_string): 
     if not coord_string in self.lines: 
      self.lines[coord_string] = Line(self.make_new_id(), coord_string) 

     return self.lines[coord_string] 

    def get_all_lines(self): 
     return self.lines.values 
Verwandte Themen