To start, I learned Java then C, and am now delving into Python 3.6. I am having trouble with printing values from an object in main
Initially I started with passing values into my object Preferences
with using self
. I then instantiated a variable p
from my Preferences
object and then printed p
in my main method. When I tried printing, none of my values that I tried setting in my methods appeared. I had more luck with this by setting values in Preferences
with p.size, p.preferences, etc...
because I was able to see that when printing p
in a method, all my set values would appear.
Beneath is my code. I am reading integers from a file, and then setting my values inside of my Preferences
object to them.
Here is the file:
4
1 2 3 4
2 1 3 4
3 4 1 2
4 3 1 2
2 1 3 4
1 2 3 4
4 3 1 2
3 4 1 2
And here is my code.
class Preferences:
def __init__(self):
self.preferences = []
self.size = 0
self.m_preferences = []
self.f_preferences = []
def __str__(self):
return "Preferences object\nSize: {}\nPreferences: {}\nMale Preferences: {}\nFemale Preferences: {}".format(self.size, self.preferences, self.m_preferences, self.f_preferences)
def get_preferences(self):
p = Preferences()
p.size = self.size
p.preferences = self.preferences
p.m_preferences = self.preferences[0: len(self.preferences)//2]
p.f_preferences = self.preferences[len(self.preferences)//2 : len(self.preferences)]
def read_file(self):
p = Preferences()
with open('input1.txt', 'r') as f:
p.size = f.readline()
temp_preferences = f.readlines()
p.preferences = [x.strip().split(' ') for x in temp_preferences[0:]]
p.get_preferences()
def main():
p = Preferences()
p.read_file()
print(p)
if __name__ == "__main__":
main()
Here is my attempt at passing all values in my methods using p = Preferences()
to assign values to variables like size, m_preferences, etc.
I expected to see
Preferences object
Size: 4
Preferences: [['1', '2', '3', '4'], ['2', '1', '3', '4'], ['3', '4', '1', '2'], ['4', '3', '1', '2'], ['2', '1', '3', '4'], ['1', '2', '3', '4'], ['4', '3', '1', '2'], ['3', '4', '1', '2']]
Male Preferences: [['1', '2', '3', '4'], ['2', '1', '3', '4'], ['3', '4', '1', '2'], ['4', '3', '1', '2']]
Female Preferences: [['2', '1', '3', '4'], ['1', '2', '3', '4'], ['4', '3', '1', '2'], ['3', '4', '1', '2']]`
But Instead I get empty values of these values being:
Preferences object
Size: 0
Preferences: []
Male Preferences: []
Female Preferences: []`
The problem in your code is that you are instantiating new Preference object inside read_file
and get_preferences
.
The fixed code will look like
class Preferences:
def __init__(self):
self.preferences = []
self.size = 0
self.m_preferences = []
self.f_preferences = []
def __str__(self):
return "Preferences object\n{}\n{}\n{}\n{}".format(self.size, self.preferences, self.m_preferences, self.f_preferences)
def get_preferences(self):
self.m_preferences = self.preferences[0: len(self.preferences)//2]
self.f_preferences = self.preferences[len(self.preferences)//2 : len(self.preferences)]
def read_file(self):
with open('input1.txt', 'r') as f:
self.size = f.readline()
temp_preferences = f.readlines()
self.preferences = [x.strip().split(' ') for x in temp_preferences[0:]]
self.get_preferences()
def main():
p = Preferences()
p.read_file()
print(p)
if __name__ == "__main__":
main()
And the output:
python3 t.py
Preferences object
4
[['1', '2', '3', '4'], ['2', '1', '3', '4'], ['3', '4', '1', '2'], ['4', '3', '1', '2'], ['2', '1', '3', '4'], ['1', '2', '3', '4'], ['4', '3', '1', '2'], ['3', '4', '1', '2']]
[['1', '2', '3', '4'], ['2', '1', '3', '4'], ['3', '4', '1', '2'], ['4', '3', '1', '2']]
[['2', '1', '3', '4'], ['1', '2', '3', '4'], ['4', '3', '1', '2'], ['3', '4', '1', '2']]