Я немного запутался в том, как напрямую наследовать переменные от функции родительского класса. Например, у меня есть следующее:
class BaselineModels:
def __init__(self):
self.logpath = './log/models/'
self.mpath = './models/'
Затем я создаю подкласс, который имеет свой собственный __init__ и вызывает __init__, но я не могу получить доступ к super(). Я знаю, что это как-то связано с привязкой self.mpath к экземпляру класса, но как мне добиться этой функциональности, поскольку у меня есть большое количество подклассов, для которых я не хочу реплицировать эти переменные пути.
Причина, по которой я хочу этого, заключается в том, что я вызываю функции из этого родительского класса из своего подкласса, который использует переменные self родительского класса (self является членом родительского класса):
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()
Я называю csv_to_df снизу файла.
Обновлено: Обновлено для включения определения подкласса
@Kevin Я обновил свой вопрос, включив в него определение подкласса и некоторую другую информацию.
mpath против rpath?
похоже, что AttributeError включен df = pd.read_csv(self.rpath, sep='\t'), который вызывает self.rpath, который, насколько я могу судить, нигде не установлен, вы получаете аналогичную ошибку для self.mpath?
@kuomi Вы можете наследовать функцию, используя суперфункцию. Подобно super(<имя базового класса>, self).__init__() таким образом






Вы должны вызвать метод __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/'
А, я думал super() позаботился об инициализации здесь. Это работает. Спасибо.
Вы также можете следовать этому методу.
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/'
Странно, то, как вы описываете свой подкласс, я ожидаю, что он сможет получить доступ к mpath. Предоставьте минимальный воспроизводимый пример, который включает определение подкласса.