2017-05-16 50 views
3

假設我有一個名爲Person的課程,其中只有該人的姓名和性別。定義一個python類時,如何在其中設置一個隨機變量?

性別應該從男性和女性中隨機選擇。爲此,我導入random.randint()函數。隨機性是根據隨機int確定的。

import random 

class Person: 
    alias = random.randint(1, 3) 
    if alias == 2: 
     gender = 'Male' 
    else: 
     gender = 'Female' 

    def __init__(self, name): 
     self.name = name 

r = Person('rachel') 
s = Person('Stanky') 
print(r.gender) 
print(s.gender) 

但是,我得到的來自這個班的不同人的結果都具有相同的性別。我的理解是randint是固定的,一旦生成。我的問題是如何使每個類實例的不同。

+0

典論階級的頂層只運行一次(在導入時)。如果你想爲每個實例做出選擇,把代碼放在'__init__'方法中。 –

回答

1

你永遠不會得到不同性別的原因是因爲性別屬性是變量。一旦Python創建您的類對象Persongender的值永遠不會再次計算。您需要使gender變量爲實例屬性。這意味着性別將按每個實例計算,而不是按類定義計算。例如:

import random 

class Person: 
    def __init__(self, name): 
     self.name = name 
     alias= random.randint(1, 3) 
     if alias == 2: 
      self.gender = 'Male' 
     else: 
      self.gender = 'Female' 

r= Person('rachel') 
s= Person('Stanky') 

print(r.gender) 
print(s.gender) 

,輸出

Female 
Male 

在一個側面說明,我認爲你的任務一個更好的選擇是使用random.choice()從性別的列表中選擇一個隨機的性別(男性或女):在上述我的例子

from random import choice 

class Person: 
    genders = ('Male', 'Female', 'Female') 
    def __init__(self, name): 
     self.name = name 
     self.gender = choice(Person.genders) 

rachel = Person('Rachel') 
stanky = Person('Stanky') 

print(rachel.gender) 
print(stanky.gender) 

通知,Person.genders類變量。這是有意的。因爲我們只需要創建一個性別列表一次,我們可以使該列表成爲一個類級別的變量。

+5

另一件值得一提的事情是:使用'self.gender = random.choice(['Male','Female'])''可以使這個過程簡單得多。 – Mac

+0

@Mac我正要添加一個編輯,說完全一樣的東西。偉大的思想活着,呃? ;-) –

+0

你應該把「選擇」方法放在最上面。這是解決問題的正確方法! – MSeifert

0

您應該在__init__下放置隨機性別代,以便它可以隨機爲每個類實例生成。結果

import random 

class Person: 
    def __init__(self, name): 
     self.name = name 
     alias= random.randint(1, 3) 
     if alias == 2: 
      self.gender = 'Male' 
     else: 
      self.gender = 'Female' 

r= Person('rachel') 
s= Person('Stanky') 
print(r.gender) 
print(s.gender) 

三次:

$ python classRandom.py 
Male 
Female 
$ python classRandom.py 
Female 
Female 
$ python classRandom.py 
Female 
Male 
0

性別變量是目前類變量,這就是爲什麼它停留創建的所有實例的相同。您需要將它們更改爲實例的屬性。

附註:random.randint(1, 3)將返回1,2或3,不只是1或2.它與索引不同,其中尾部被忽略。現在,成爲女性的可能性更高,因爲它可能是1或3,所以random.randint(1,2)更有意義。我提到這個以防萬一它不是故意的。您也可以使用random.choice,它將從列表中選擇一個隨機選擇。

import random 

class Person: 

    def __init__(self, name): 
     self.name = name 
     self.gender= random.choice(["Male", "Female"]) # or random.choice(["Male", "Female", "Female"]) if you want a higher chance of being a female 

r= Person('rachel') 
s= Person('Stanky') 
print(r.gender) 
print(s.gender) 
1

看來你已經正確地猜出了原因,爲什麼性別不會改變。爲了解決這個問題,你可以使用一個propertygender

import random 

class Person(object): 
    def __init__(self, name): 
     self.name = name 

    @property 
    def gender(self): 
     try: 
      # If it has been defined for the instance, simply return the gender 
      return self._gender 
     except AttributeError: 
      # If it's not defined yet, define it, and then return it 
      self._gender = random.choice(['male', 'female']) 
      return self._gender 

r = Person('rachel') 
s = Person('Stanky') 
print(r.gender) 
print(s.gender) 
+0

與以下不同:'def __init __(self,name):self.name = name self.gender = random.choice(['Male','Female'])'?因爲我在這裏看到的是如果沒有聲明性別變量,那麼我們聲明一個新的性別變量。但是,這個類只有一個變量,即名稱。這意味着沒有性別局部變量將被確定,不是嗎? –

+0

你是對的,它是不同的。只要你不訪問'性別'屬性,'_gender'變量就是未定義的。但只要您訪問該屬性,它將被定義。所以這是一個不同的實現,但對於大多數目的來說,它的行爲與'__init__'解決方案完全相同。 – MSeifert

相關問題