2017-09-28 4 views
3

Ich habe den folgenden Code:Generieren von Zufallszahlen für Klassenattribut

from numpy import random 

class Person(): 

    def __init__(self, name, age=random.randint(18,65)): 
     self.name = name 
     self.age = age 

I Alter will eine Zufallszahl zwischen 18 und 65, wird, sofern nicht ausdrücklich angegeben ist. Allerdings, wenn ich verschiedene Instanzen dieser Klasse, wie folgt erstellen:

p1 = Person('Bob') 
p2 = Person('Sue') 
p3 = Person('Jeff') 

Jede Person hat immer das gleiche Alter. Wie kann ich das beheben?

Antwort

2
genannt wird

der Grund für dieses Verhalten ist, dass Standardwert für Attribute wird initialisiert und nur einmal festgelegt, so dass Code-Schnipsel random.randint(18,65) würde ausgeführt und als Standardwert eingestellt wird Für das Alter ist das der Grund für den gleichen Ausfall Wert für das Alter, wenn das Alter nicht angegeben wird.

zu beheben Problem der Standardwert auf keine festgelegt und Prüfung durchführen und von zufälligen Wert zuweisen, wenn nötig:

from numpy import random 


class Person(): 

    def __init__(self, name, age=None): 
     if age is None: 
      age = random.randint(18,65) 
     self.name = name 
     self.age = age 

Nützliche Informationen in Bezug auf Standardattribute:

2

Der Grund für die age ist immer gleich, da der Wert für Ihren age Parameter definiert wird, wenn das Verfahren __init__ definiert ist und es wird nicht jedes Mal, wenn Sie Ihre Methode aufrufen, neu erstellt werden, die Instanziierung der variablen age innerhalb der Methode bewegen wenn Sie wollen, diese Methode jedes Mal ändern

from numpy import random 

class Person(): 
    def __init__(self, name, age=None): 
     self.name = name 
     self.age = age if age else random.randint(18, 65) 

p1 = Person('Bob') 
p2 = Person('Sue', 20) 
p3 = Person('Jeff') 

print(p1.age) 
>> 56 
print(p2.age) 
>> 20 
print(p3.age) 
>> 20 

print(Person('Sue', 20).age) 
>> 20 
+0

Wie hoch ist der Alterswert für Person ('Sue', 0)? –

+0

@AndrriyIvaneyko Es ist 20, Ihre Antwort ist eine genaue Kopie dieser Antwort, wie ist es 0? – AK47

+0

ja, es ist super ähnlich, aber nicht gleich, das 'wenn Alter' vs' wenn Alter ist keine' ist völlig anders, auch erklären Argumentation ist das andere aus meiner Sicht (das ist die Begründung für eine andere Antwort, wenn Sie interessiert sind der Grund). –

Verwandte Themen