2016-08-05 35 views
0

Ich habe die folgende Klasse:Python: Zugriff auf eine Liste in einer Klasse mit Eigenschaften oder benutzerdefinierten Methoden

def Interface: 
    def __init__(self, vlan, zone, address): 
     self.vlan = vlan 
     self.zone = zone 
     self.__address = [] 
     for i in address: 
      self.__address.append(ipaddress.IPv4Interface(i)) 

eine Schnittstelle Instanz nie mehr als eine Zone und vlan haben könnte, konnte aber 1+ Adressen hat. Bisher ist der Adressparameter eine Liste mit einer oder mehreren Adressen als Items.

Das ist also meine erste Frage: Ist es eine gute Übung, eine Liste als Argument zu verwenden?


Zur Zeit denke ich darüber, wie die Adresse Variable zuzugreifen:

  1. Verwenden Eigenschaften

    I Eigenschaften @ address.set für Anfügen zum Löschen einer Adresse @ address.del verwenden könnte eine bestimmte Adresse und @ Adresse, um alle Adressen als Liste zu erhalten.

    Was ich nicht mit diesem Ansatz möchte, ist:

    • No way in die Zukunft (imho) dies wie ein ‚Set‘ mit Funktionen zu erweitern, die alle früheren Werte überschrieben (duno Wenn es notwendig)
    • Es sieht aus wie ein "einzelner Wert", aber es ist eine Liste im Hintergrund.
  2. schreiben benutzerdefinierten Methoden

    Verwenden Sie benutzerdefinierte Methoden wie: def add_address (Adresse), def clear_address(), get_address_all()

    Was ich mit diesem Ansatz nicht mag, ist:

    • Es ist nicht pythonic fühlen (kann dies mehr ist ein Gefühl, als eine Tatsache)
  3. Warum zum Teufel ich darüber nachdenke, nur die Liste

    Ich mag nicht mit diesem Ansatz Was direkt als Interface.address verwenden ist:

    • Es ist nicht eine einfache Liste mit Strings, sondern Instanzen IPv4Interface-Klasse. Wenn es meinen Kollegen nicht interessiert, könnte es schlimmer werden.

Kann hier jemand sein konnte mir ein paar nützliche Hinweise oder Grund bekommen, warum eine Art und Weise über den anderen bevorzugen (oder eine andere sein).

Danke!

Antwort

0

Sie ändern die Schnittstelle, um die Übergabe einer Variablenadresse an den Konstruktor zu ermöglichen.

class Interface: 
    def __init__(self, vlan, zone, *addresses): 
     # ... 

i = Interface(myVlan, myZone, myAddress1, myAddress2) 

addresses wird ein Tupel myAddress1 und myAddress1 enthält.Alternativ können Sie entweder ein Adressobjekt oder eine Liste von Adressobjekten akzeptieren und den Parameter entsprechend seinem Typ behandeln. Was den Adresszugriff anbelangt, würde ich mich definitiv für die Option Nummer 2 entscheiden. Sie ist sehr flexibel und einfach zu lesen, zu verstehen und zu benutzen.