2016-06-29 17 views
0

Ich bin mir nicht sicher, ob ich die richtige Terminologie bin mit, aber hier ist mein Code:selbstbeziehende Variablen während der Instanziierung einer Klasse übergeben

class Candidate(object): 
     def __init__(self, party_code, state, age=random.randint(35, 70), 
       social_index=(1 if party_code == 'dem' else -1 if party_code == 'rep' else 0), 
       econ_index=(-1 if party_code == 'dem' else 1 if party_code == 'rep' else 0)): 
      self.state = state 
      self.party_code = party_code 
      self.age = age 
      self.social_index = social_index 
      self.econ_index = econ_index 

Ich mag wäre in der Lage sein party_code verwenden um zu bestimmen, was die Anfangswerte von social_index und econ_index sein werden, aber das ist nicht mit der Art, wie ich es derzeit eingerichtet habe, erlaubt. Gibt es eine alternative Möglichkeit, die Keyword-Variable beim Erstellen dieser Klasse dynamisch festzulegen?

+2

der Standardwert zur Definitionszeit bestimmt wird (wenn der Klassenblock ausführt) nicht wenn die Funktion ausgeführt wird, lege einfach den Code, der ihren Wert bestimmt, in den Funktionskörper. –

+0

Beachten Sie, dass das der Punkt ist, an dem eine "__init__" -Methode verwendet wird, um Code zum Erstellen des Objekts auszuführen. Ihr Alter wird immer auf die gleiche Zahl zurückgesetzt, die nur einmal zur Definitionszeit und nicht einmal pro Instanz generiert wurde. –

+0

Sie sagen also, wenn ich die Klasse 2 separate Zeiten instanziieren, wird der Alterswert immer gleich sein? Gibt es eine Möglichkeit, bei jeder Instanziierung ein zufälliges Alter zu erreichen? – Phil

Antwort

0

Angenommen, Sie wollen social_index und econ_index seinen Parameter Code aussehen würde:

class Candidate(object): 
    def __init__(self, party_code, state, age=None, 
      social_index=None, econ_index=None): 
     if age is None: 
      age=random.randint(35, 70) 
     if social_index is None: 
      social_index = (1 if party_code == 'dem' else -1 if party_code == 'rep' else 0) 
     if econ_index is None: 
      econ_index=(-1 if party_code == 'dem' else 1 if party_code == 'rep' else 0) 
     self.state = state 
     self.party_code = party_code 
     self.age = age 
     self.social_index = social_index 
     self.econ_index = econ_index 

Sie müssen die Logik geben Sie die Werte in der Funktion Körper, um zu bestimmen, für die es, wenn die Funktion ausgeführt werden soll, wird genannt. Der Standardwert für die Funktion wird bei der Definition festgelegt (der def Block), weshalb die Mutable default trap existiert.

Auf der anderen Seite, wenn Sie brauchen, um sie als Argument nicht in der Lage passieren können Sie es so weit vereinfachen:

class Candidate(object): 
    def __init__(self, party_code, state): 
     self.state = state 
     self.party_code = party_code 
     self.age = random.randint(35, 70) 
     if party_code == 'dem': 
      self.social_index = 1 
      self.econ_index = -1 
     elif party_code == "rep": 
      self.social_index = 0 
      self.econ_index = 0 
     else: 
      self.social_index = 0 
      self.econ_index = 0 
+0

Ich sehe, dies scheint eine viel bessere Umsetzung dessen zu sein, was ich erreichen wollte. Ich möchte, dass ** social_index ** und ** econ_index ** optionale Argumente sind, die jede Logik außer Kraft setzen, die die Standardwerte bestimmen würde, so dass Ihr erstes Beispiel genau das ist, wonach ich gesucht habe. Vielen Dank! – Phil