Search code examples
pythonpython-3.xoopself

Having trouble passing values to my object in Python. Use `self` or is there a better approach?


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: []`

Solution

  • 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']]