'Class object not returning value

class Friend:
    all = []
    def __init__(self):
        self.__fname = None
        self.__lname = None
        self.__fid = None

    @property
    def fname(self):
        return self.__fname

    @fname.setter
    def fname(self, value):
        self.__fname = value
    
    @property
    def lname(self):
        return self.__lname

    @lname.setter
    def lname(self, value):
        self.__lname = value
    
    @property
    def fid(self):
        return self.__fid

    @fid.setter
    def fid(self, value):
        self.__fid = value

#DB Class
class db_friend()
    def db_load_friend(self, obj, fname,lname):
        obj.fname = fname
        obj.lname  = lname
        obj.fid = "XYZ"
        
        obj.all.append(obj)

# function that acts on the friend class

def manage_friend():
    fname = "Joe"
    lname = "Root"
    objfriend = Friend()
    db_friend.db_load_friend(objfriend, fname,lname)
    print (objfriend.fname) # this is not working
    print (objfriend.fid) #this is not working
    
    for user in objfriend.all:
        print (objfriend.fid) #this is working

Both objfriend.fname and objfriend.fid is printing no value. I am trying to load the objfriend object by passing to the db_load_friend method of the db class. I am able to see the values if I loop through the "all" variable. May I know why this is not working or using the static variable "all" is the only way to do it?



Solution 1:[1]

You need to create an instance of db_friend so you can call the db_load_friend() method:

def manage_friend():
    fname = "Joe"
    lname = "Root"
    objfriend = Friend()
    objdbfriend = db_friend()
    objdbfriend.db_load_friend(objfriend, fname,lname)
    print (objfriend.fname)
    print (objfriend.fid)
    
    for user in objfriend.all:
        print (objfriend.fid) #this is working

Or, since db_load_friend() doesn't need to use self, you could make it a static method.

class db_friend()
    @staticmethod
    def db_load_friend(obj, fname,lname):
        obj.fname = fname
        obj.lname  = lname
        obj.fid = "XYZ"
        
        obj.all.append(obj)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Barmar