2017-05-16 17 views
3

私はPersonと呼ばれるクラスを持っているとします。このクラスには、その人の名前と性別のみが含まれています。Pythonクラスを定義するときに、どのようにランダム変数を設定するのですか?

性別は男性と女性の中からランダムに選択する必要があります。これを行うには、random.randint()関数をインポートします。ランダムジェンダーは、ランダムintに従って決定されます。

しかし、私はこのクラスとは異なる人物のために同じ性別を持っています。私の理解はrandintが一度生成されて固定されています。私の質問は、各クラスインスタンスごとに異なるようにする方法です。

+0

コード:この問題を解決するには、propertygenderのために使用することができます。すべてのインスタンスに対して選択をしたい場合は、コードを '__init__'メソッドに入れてください。 –

答えて

1

性別属性がクラスの変数であるため、異なる性別を取得することがない理由は、 PythonがクラスオブジェクトPersonを作成すると、genderという値は決して計算されません。 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

あなたは間違いなく 'choice'アプローチを上に置くべきです。それは問題を解決する正しい方法です! – 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だけでなく、1,2または3のいずれかを返します。これは、エンディングが無視されるインデックス作成と同じではありません。今のところ、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

性別が変わらない理由を正しく推測しているようです。 (インポート時に)一度だけ実行されるクラスのトップレベルに

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'というプロパティにアクセスしない限り、' _gender'変数は定義されていません。しかし、プロパティにアクセスするとすぐに定義されます。だからそれは別の実装ですが、ほとんどの目的のために '__init__'のように振る舞います。 – MSeifert

関連する問題