An instance of the Rabbit class is created in a for loop and given a datetime object as init variable but all instances get the same datetime value. I expected a time difference for each instance; what am I missing in understanding here?
from datetime import datetime
class Rabbit_birth:
num_eyes = 2 # <- Class variable
num_legs = 4
num_ears = 2
num_tails = 1
num_of_rabbits = 0
def __init__(self, name = 'Rabbit',
fur_colour = 'unknown',
eye_colour = 'unknown',
sex = 'unsexed',
breed = 'unknown',
dob = datetime.now(),
tob = datetime.now()
):
self.name = name # <- Instance variable
self.fur_colour = fur_colour
self.eye_colour = eye_colour
self.sex = sex
self.breed = breed
self.dob = str(dob.strftime("%x"))
self.tob = str(tob.strftime("%X"))
Rabbit_birth.num_of_rabbits += 1
def display_rabbit(self):
dob_time = self.dob+" at "+self.tob
return ("{0.name} is a {0.sex} rabbit"
" and has {0.fur_colour} fur and "
"{0.eye_colour} eyes, {0.name} is "
"of the {0.breed} breed of rabbits.\n"
"{0.name}'s DOB is ").format(self) + dob_time
################################################
print()
print('Number of rabbits is ',Rabbit_birth.num_of_rabbits)
rabbits=[]
def create_rabbit():
lr=[]
rabbit = ('name', 'fur colour', 'eye colour', 'sex', 'breed')
for item in rabbit:
r = input(item+' >')
lr.append(r)
r0,r1,r2,r3,r4=lr
name = Rabbit_birth(r0,r1,r2,r3,r4)
return name
for i in range(3):
name=create_rabbit()
rabbits.append(name)
print(rabbits[i].display_rabbit())
I see the mistake I have made, it's a matter of passing the datetime object in the wrong scope.
Here is the relevant corrected code:
## <- class experiment
from datetime import datetime
class Rabbit_birth:
num_eyes = 2 # <- Class variable
num_legs = 4
num_ears = 2
num_tails = 1
num_of_rabbits = 0
def __init__(self, name = 'Rabbit',
fur_colour = 'unknown',
eye_colour = 'unknown',
sex = 'unsexed',
breed = 'unknown',
dob = None, # This line changed
tob = None # This line changed
):
self.name = name # <- Instance variable
self.fur_colour = fur_colour
self.eye_colour = eye_colour
self.sex = sex
self.breed = breed
self.dob = datetime.now() # This line changed
self.tob = datetime.now() # This line changed
Rabbit_birth.num_of_rabbits += 1
def display_rabbit(self):
# This line below changed
dob_time = str(self.dob.strftime("%x"))+" at "+str(self.tob.strftime("%X"))
return ("{0.name} is a {0.sex} rabbit"
" and has {0.fur_colour} fur and "
"{0.eye_colour} eyes, {0.name} is "
"of the {0.breed} breed of rabbits.\n"
"{0.name}'s DOB is ").format(self) + dob_time
################################################