2017-11-22 7 views
0

Das ist meine Klasse in der Datei files.py:bekommt alle Instanzen einer Klasse in Python

class Files(): 

    def __init__(self, *, kwargs1=None, ......, kwargsx=None): 
     self.kwargs1 = kwargs1 
     ................... 
     ................... 
     ................... 
     self.kwargsx = kwargsx 

     __validate() 
     if self.kwargs1 == "create": 
      self.__create() 
     if kwargsx == "remove": 
      self.__remove() 

    def __validate(): 
     validate attributes of object and raise execption if fails 

    def __create(self): 
     create file 

    def __remove(self): 
     remove file 

In einer anderen Datei tasks.py ich diese:

from files import File 

File(kwargs1="create", kwargs2="path/to/destination1", kwargs3="/path/to/source1",..........) 
File(kwargs1="create", kwargs2="path/to/destination2", kwargs3="/path/to/source2",..........) 

Die aktuelle Situation ist, dass jedes Objekt ist validiert werden und dann mit __create() oder __remove() fortfahren. Was ich gefragt habe, ist, ob es möglich ist, zuerst alle Objekte zu validieren und dann fortzufahren. Ich könnte es in der tasks.py erreichen. Ich hatte die privaten Methoden __create() und __remove() als öffentliche Methoden create(self) und remove(self) und die Klasse sieht wie folgt zu erklären:

class Files(): 

    def __init__(self, *, kwargs1=None, ......, kwargsx=None): 
     self.kwargs1 = kwargs1 
     ................... 
     ................... 
     ................... 
     self.kwargsx = kwargsx 

     __validate() 

    def __validate(): 
     validate attributes of object and raise execption if fails 

    def create(self): 
     create file 

    def remove(self): 
     remove file 

Und die tasks.py:

files = [] 
try: 
    files.append(File(kwargs1="create", kwargs2="path/to/destination1", kwargs3="/path/to/source1",..........)) 
    files.append(File(kwargs1="create", kwargs2="path/to/destination2", kwargs3="/path/to/source2",..........)) 
except ValueError as e: 
    print(e) 
else: 
    for item in files: 
     if item.kwargsx == "create": 
      create(item) 
     elif item.kwargsx == "remove": 
      remove(item) 

Meine Frage ist, ob es möglich ist, zu implementieren Diese Logik in der Klasse Datei selbst? Der einzige Weg, an den ich denken könnte, ist eine Arbeit mit der Überprüfung des Stapels und iterieren über jede Objektinitialisierung, aber ich weiß nicht, ob es funktionieren würde!

Antwort

0

Dies ist ein allgemeines Schema - eine Klasse hat keinen Verweis auf Instanzen,

class File: 
    _instances = [] 
    def __init__(self, ..., action=None): 
     .... 
     self.action = action 
     File._instances.append(self) 

    @classmethod 
    def resolve_actions(cls): 
     for instance in cls._instances: 
      if instance.action == "create": 
       instance.__create() 
      elif instance.action == "remove": 
       instance.__remove() 

und dann irgendwo im Code

File.resolve_actions() 
+0

ich die Attribute des Objekts nacheinander Validierung erreicht habe , zum Beispiel wenn alles OK mit der ersten Instanz erstellt wird, und dasselbe für das zweite Objekt. Ich versuche, alle Objekte zu bekommen, indem ich sie einzeln überprüfe und dann erst die Aktion für jedes mache, oder das erste Objekt, validiere und speichere es, bekomme das zweite, bestätige und speichere, wenn alles vorbei ist, fahre mit dem entsprechenden fort Aktion für jedes Objekt! Ist ein solches Szenario möglich? – Max

+0

@Max, habe ich Ihnen ein allgemeines Schema zur Verfügung gestellt. In einer Schleife können Sie Ergebnisse akkumulieren und in einer zweiten Schleife darauf reagieren - oder Sie können sie als ein anderes Klassenattribut festlegen und Ihre Entscheidung mit jeder Instanzerstellung akkumulieren und sie dann erneut einmal für alle Instanzen ausführen. – volcano

+0

Danke für deine Antwort, aber ich denke, ich habe meine Frage nicht deutlich gemacht oder ich verstehe einfach nicht, wie es geht. Irgendwie werde ich die Frage bearbeiten. – Max

Verwandte Themen