Подкласс, наследующий переменные от Parent (Python) - PullRequest
0 голосов
/ 08 апреля 2019

Я немного запутался в том, как напрямую наследовать переменные из функции родительского класса '__init__.Например, у меня есть следующее:

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

Затем я создаю подкласс, который имеет свой собственный __init__ и вызывает super(), но я не могу получить доступ к self.mpath.Я знаю, что это связано с тем, что self привязан к экземпляру класса, но как мне добиться этой функциональности, поскольку у меня есть достаточное количество подклассов, для которых я не хочу реплицировать эти переменные пути.

Причина, по которой я хочу этого, заключается в том, что я вызываю функции из этого родительского класса из моего подкласса, который использует переменные родительского класса self (csv_to_df является членом родительского класса):

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

Вызов этого из подкласса приводит к

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'

Определение подкласса

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

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

Я вызываю als.run() из нижней части файла.

РЕДАКТИРОВАТЬ: Обновлено, чтобы включить определение подкласса

Ответы [ 2 ]

3 голосов
/ 08 апреля 2019

Вы должны вызвать метод __init__() объекта super().Как то так:

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/'
1 голос
/ 08 апреля 2019

Вы также можете использовать этот метод.

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/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...