Seite 1 von 1

Objekte/Instanzen dynamisch erzeugen

Verfasst: Montag 15. Juni 2009, 09:35
von Ovaron
Hi!

Ich hab gerade mit Python begonnen und schreibe die ersten Programme. Dabei würde ich jetzt gerne folgendes realisieren:

.)Eigene Klasse schreiben (erledigt)
.)Programm liest Daten für Instanzen aus einer Konfigurationsdatei (erledigt)
.)Instanzen werden mit den angegebenen Namen und Attributen erzeugt

Gibt es eine Möglichkeit, die Instanzen nach dem Einlesen anhand der Daten aus der Konfigurationsdatei zu erzeugen? Wenn ja: wie müsste so ein Code beispielsweise aussehen?

Verfasst: Montag 15. Juni 2009, 09:55
von Zap
Hallo Ovaron und Willkommen!

Wie soll denn so eine Konfigurationsdatei aussehen?
Hast du dir da schon Gedanken drüber gemacht bzw. eine konkrete Vorstellung?

Verfasst: Montag 15. Juni 2009, 10:06
von EyDu
Alle benötigten Parameter übergibst du einfach der __init__-Methode der entsprechenden Klasse. Die kannst du dann so bauen, dass alles nach deinen Wünschen abläuft.

Code: Alles auswählen

class Spam(object):
    def __init__(self, some, parameters, here):
        do_something_with_parameters_and_other_initialization_stuff(...)

we, are, parameters = load_configuration(...)
s = Spam(we, are parameters)

Verfasst: Montag 15. Juni 2009, 11:13
von Ovaron
Zap hat geschrieben:Hallo Ovaron und Willkommen!

Wie soll denn so eine Konfigurationsdatei aussehen?
Hast du dir da schon Gedanken drüber gemacht bzw. eine konkrete Vorstellung?
Die Konfigurationsdatei sieht wie folgt aus:

Code: Alles auswählen

name= switch1
ip= 10.0.0.101
port= 161

name= switch2
ip= 10.0.0.202
port= 161
Dazu die Klassendefinition + einlesen der Konfiguration:

Code: Alles auswählen

from config_reader import readCfgFile, analyseLine

class Switch:
    def __init__(self, ip, port):
        self.ip = ip
        self.port = port    
        
config = readCfgFile('config2.cfg')
Ergebnis: config = [['switch1', '10.0.0.101', '161'], ['switch2', '10.0.0.202', '161']]
Wie man erkennen kann, werden die einzelnen Switches, die zukünftigen Objekte, als Liste zurückgegeben. Nun würde ich gerne pro Listeneintrag ein Objekt erzeugen, sprich:

switch1 = Switch(10.0.0.101, 161)
switch2 = Switch(10.0.0.202, 161)

Recht einfach würde das mit einer for-Schleife gehen, die jeden Listeneintrag abklappert, nur wie erstelle ich die Objekte dynamisch während der Laufzeit nach dem einlesen der Konfiguration?

@Eydu: Danke für das Beispiel. Über die __init__-Methode hab ich schon gelesen, nur wie hilft mir das bei meinem Problem weiter?

Verfasst: Montag 15. Juni 2009, 11:29
von Zap
Bei der gegebenen Konfiguration wäre die Lösung auf dem schnellen Wege so:

Code: Alles auswählen

In [5]: class Switch:
   ...:     def __init__(self, ip, port):
   ...:         self.ip, self.port = ip, port
   ...:
   ...:

In [6]: config = [['switch1', '10.0.0.101', '161'], ['switch2', '10.0.0.202', '161']]

In [7]: switches = [Switch(c[1], c[2]) for c in config]

In [8]: switches[0].ip
Out[8]: '10.0.0.101'

In [9]: switches[0].port
Out[9]: '161'
Was ich jetzt nicht verstehe was du mit dynamisch meinst.
Wird die Konfiguration wärend der Laufzeit wiederholt eingelesen?

Verfasst: Montag 15. Juni 2009, 11:38
von EyDu
Mal so eine Anmerkung: Ein Switch kennt weder IP-Adressen noch Ports.

Verfasst: Montag 15. Juni 2009, 11:41
von Ovaron
Danke, genauso wollte ich es :)

Ich kannte bist jetzt blos die Erstellung eines Objektes in der Form "switch1 = Switch(10.0.0.101, 161)". Dynamisch war vielleicht der falsche Ausdruck für das was ich im Endeffekt wollte.

Verfasst: Montag 15. Juni 2009, 11:46
von Ovaron
EyDu hat geschrieben:Mal so eine Anmerkung: Ein Switch kennt weder IP-Adressen noch Ports.
Bei einer reinen L2-Multi-Port-Bridge hast du recht. Sobald man den Switch aber verwalten kann, kann man Interfaces oft auch IP-Adressen zuweisen. Bei meinem Switch ist das Interface mit der IP 10.0.0.101 beispielsweise das VLAN101.
Wie man am Port 161 erkennt, verwende ich die übergebene IP-Adresse um die Switches per SNMP anzusprechen. Mit einer reinen L2-Multi-Port-Bridge wäre so etwas natürlich nicht möglich.