python


When defining a python class, how to set a random variable in it?


Say I have a class called Person, which will have only the person's name and gender.
The gender should be randomly selected from Male and Female. To do that, I import the random.randint() function. The random gender is determined according to the random 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)
However, the result I get for different person from this class all have the same gender. My understanding is the randint is fixed once been generated. My question is how to make it different for each class instance.
The reason your never getting a different gender is because the gender attribute is a class variable. Once Python creates your class object Person, the value of gender is never computed again. You need to make the gender variable an instance attribute. That means the gender will be computed on a per instance basis, instead of per class definition. eg:
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)
Which outputs
Female
Male
On a side note, I think a much better choice for your task would be to use random.choice() to select a random gender from a list of genders(male or female):
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)
Notice in my example above, Person.genders is a class variable. This is on purpose. Because we only need to create a list of genders once, we can make the list a class level variable.
It seems you already guessed the reason correctly why the gender doesn't change. To solve this you could use a property for gender:
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)
You should put random gender generation under __init__, so that it would be randomly generated for each class instance.
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)
Three times of results:
$ python classRandom.py
Male
Female
$ python classRandom.py
Female
Female
$ python classRandom.py
Female
Male
The gender variable is currently a class variable, that's why it stays the same for all the instance created. You will need to change them into a instance's attribute.
Side note: random.randint(1, 3) will either return 1, 2 or 3 not just 1 or 2. It is not the same as indexing, in which the ending is ignored. Right now, there's a higher chance to be a Female since it could be 1 or 3, so random.randint(1,2) makes more sense. I mentioned this just in case it was not done on purpose. You can also use random.choice, which will choose a random selection from a list.
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)

Related Links

Untangle re.findall capturing groups: 'list' object has no attribute 'join'
Twisted equivalent of ThreadPoolExecutor (in Scrapy pipeline)
numpy.minimum applied to pandas DataFrame and Series
Find the area of a bounding polygon that encloses a set of points
Stacking Images in a Python graph
Deleting a directory if it doesn't contain a file of specific type (Python)
Python: efficiently checking a file line by line
How to read a text file and group them in tuple?
Python importing files - for loops
How to avoid docstring duplication
python script is not executed via crontab
Pandas dataframe.to_csv() returns each row in quotes
Avoiding Stack Overflow in Python 3. Advice needed
ld cannot find .so libraries
Converting multi-line String to Dict in Python
passing structure from c++ to python

Categories

HOME
caching
cntk
sass
jsviews
performancecounter
paramiko
extract
hana
vlc
rfc
snap.svg
bro
google-spreadsheet-api
react-leaflet
postmessage
rhapsody
ng-show
flat-file
ip-camera
multicore
uiautomator
jquery-form-validator
bootstrap-typeahead
opencart2.3
cep
widevine
metadata-extractor
upnp
xor
canvasjs
getline
ifstream
rhomobile
qtablewidget
recurrence-relation
windows-10-iot-core
mmdrawercontroller
nodeclipse
pmwiki
es-shell
elfinder
linq-to-entities
exiftool
jupyter-console
nashorn
resuming-training
tiddlywiki
xmgrace
spring-data-hadoop
lotus
svn-merge
keycode
debugdiag
aescryptoserviceprovider
nssplitview
inotifypropertychanged
contour
uwp-maps
remoteapp
mfc-feature-pack
qt-linguist
cmocka
brackets-shell
insertion-sort
drf-nested-routers
persistence.xml
evo
jericho-html-parser
retro-computing
textkit
visual-studio-code
ffserver
ffprobe
adobe-indesign
google-hadoop
google-plus-one
hg-git
obfuscar
left-recursion
microblaze
crystal-reports-10
cdata
loop-invariant
cgimageref
resgen
marmalade-edk
android-4.0
cbcentralmanager
web-safe-fonts
law-of-demeter
driving-directions
v4l
smooth
ets
out-of-browser
querypath

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App