apgsov
apgsov

Reputation: 904

Subclass inheriting variables from Parent (Python)

I'm a little confused as to how to directly inherit variables from a parent class' __init__ function. For instance, I have the following:

class BaselineModels:
    def __init__(self):
        self.logpath = './log/models/'
        self.mpath = './models/'

I then create a subclass which has its own __init__ and calls super(), but I can't seem to access self.mpath. I know it's something to do with self being bound to the class instance, but how would I go about achieving this functionality as I have a good number of subclasses for which I don't want to replicate these path variables.

The reason I want this is that I call functions from this parent class from within my subclass which uses the parent's class self variables (csv_to_df is a member of the parent class):

def csv_to_df(self) -> tuple:
        """Reads in CSV file declared in __init__ (self.rpath) and converts it to a number of Pandas DataFrames.

        Returns:
            tuple: Returns tuple of Pandas DataFrames; user features, item features and 
                interactions between items.

        """

        df = pd.read_csv(self.rpath, sep='\t')
        return df

Calling this from the subclass results in

Traceback (most recent call last):
  File "model_baselines.py", line 480, in <module>
    als.run()
  File "model_baselines.py", line 366, in run
    df = self.csv_to_df()
  File "model_baselines.py", line 46, in csv_to_df
    df = pd.read_csv(self.rpath, sep='\t')
AttributeError: 'ALS' object has no attribute 'rpath'

Subclass definition

class ALS(BaselineModels):
    def __init__(self):
        super()
        self.model_name = 'als'

    def run(self):
        df = self.csv_to_df()

I call als.run() from the bottom the file.

EDIT: Updated to include subclass definition

Upvotes: 0

Views: 454

Answers (2)

AkhilKrishnan
AkhilKrishnan

Reputation: 534

You can follow this method also.

class BaselineModels:
    def __init__(self):
        self.logpath = './log/models/'
        self.mpath = './models/'

class ALS(BaselineModels):
    def __init__(self):
        super(ALS, self).__init__()
        self.model_name = 'als'

    def run(self):
        df = self.csv_to_df()


als = ALS()
als.mpath
# returns:
'./models/'

Upvotes: 1

James
James

Reputation: 36598

You have to call the __init__() method of the super() object. Something like this:

class BaselineModels:
    def __init__(self):
        self.logpath = './log/models/'
        self.mpath = './models/'

class ALS(BaselineModels):
    def __init__(self):
        super().__init__()
        self.model_name = 'als'

    def run(self):
        df = self.csv_to_df()


als = ALS()
als.mpath
# returns:
'./models/'

Upvotes: 3

Related Questions