2017-11-22 2 views
-1

Wenn eine Klasse in Python 2.7 definiert, füttern Sie in Variablen in eine init() Funktion, so werden diese zB self.xGibt es eine einfache Möglichkeit, Instanzvariablen in einer Python-Klasse zuzuweisen?

class NewClass(object): 
    def __init__(self, x, y):  
    self.x = x      
    self.y = y 

mit Instanzvariablen zuweisen Wenn eine große Anzahl von Variablen verwendet wird, ist es eine Möglichkeit, diesen Prozess vereinfachen, dh nicht jede Instanzvariable explizit definieren?

Oder gibt es einen guten Grund, warum sie explizit definiert sind?

+4

Sicher, aber Sie sollten sie wahrscheinlich alle explizit definieren. Außerdem, wenn Sie wirklich eine Reihe von Variablen bekommen, wo dies ein Schmerz wird, ist es wahrscheinlich Zeit sich zu fragen "sollten diese Daten einfach in einen Container gehen?" –

+2

Das sieht mir ziemlich einfach. Alles, was Sie ändern könnten, würde die Dinge nur komplizieren. – kindall

+0

[** 'collections.namedtuple' **] (https://docs.python.org/3/library/collections.html#collections.namedtuple) ist möglicherweise die Klasse @quamrana bedeutet, obwohl es Teil der Standardbibliothek ist , kein eingebautes. –

Antwort

2

collections.namedtuple ist nützlich, wenn Sie s wollen omething unveränderlich:

>>> from collections import namedtuple 
>>> NewClass = namedtuple('NewClass', 'x y') 
>>> obj = NewClass(x=10, y=14) 

>>> obj 
NewClass(x=10, y=14) 
0
class NewClass(object): 
    def __init__(self, **kwargs): 
    self.validate(kwargs) # optional  
    self.__dict__.update(kwargs) 

aber die ganze Idee ist eine Art stinkende

Sie zusätzlich einen statischen Satz mit zulässigen kwargs Tasten haben könnte und validate würde, wenn kwargs eine Teilmenge davon enthalten geben überprüfen

gesetzt
+0

Das ist prägnanter, aber ich würde bestreiten dass es einfacher ist. – Goyo

+0

** sehr ** stinkend. –

0

können Sie verwenden __dict__:

class NewClass: 
    def __init__(self, *args): 
     self.headers = ["var{}".format(i+1) for i in range(len(args))]#optional, can use an list of variable names you are expecting 
     for a, b in zip(self.headers, args): 
      self.__dict__[a] = b 
Verwandte Themen