Я новичок в OOP python и продолжаю спотыкаться по этому вопросу, вот мои занятия:
class SFTP:
""" Just a wrapper around pysftp module with extra functionality """
def __init__(self,
host,
username,
password):
self.host = host
self.username = username
self.password = password
self.cnopts = pysftp.CnOpts()
self.cnopts.hostkeys = None
self.latest_file = None
self.sftp_obj = pysftp.Connection(host=self.host,
username=self.username,
password=self.password,
cnopts=self.cnopts)
def _latest_file(self, remote_path, file_name) -> str:
for server_file in self.sftp_obj.listdir_attr(remotepath=remote_path):
if server_file.filename.startswith(file_name) and server_file.st_mtime > 0:
return server_file.filename
def to_df(self, remote_path, file_name, sep) -> pd.DataFrame:
self.latest_file = self._latest_file(remote_path, file_name)
if self.latest_file is not None:
return pd.read_csv(self.sftp_obj.open(remote_path + self.latest_file), sep=sep)
class Inputs(SFTP):
def __init__(self,
filename,
sep,
default_path,
backup_path):
super().__init__(host=ENV_HOST,
username=ENV_USERNAME,
password=ENV_PASSWORD)
self.filename = filename
self.sep = sep
self.default_path = default_path
def _data(self) -> pd.DataFrame:
if self.filename == 'Report_1':
data = self.to_df(remote_path=self.default_path, file_name=self.filename, sep=self.sep)
return data
elif self.filename == 'Report_2':
data = self.to_df(remote_path=self.default_path, file_name=self.filename, sep=self.sep)
return data
Так что каждый раз, когда я звоню self.to_df
, у меня будет однако подключение к SFTP-серверу и извлечение файла мне, скорее всего, потребуют все файлы, поэтому есть ли способ передать SFTP
obj и открыть 1 соединение и использовать его во всех случаях?
Я понимаю, что эта строка в конструкторе:
self.sftp_obj = pysftp.Connection(host=self.host,
username=self.username,
password=self.password,
cnopts=self.cnopts)
Это где я бы использовал метод класса? или, возможно, аннотация собственности?
Как и сейчас, я бы использовал этот класс Input
следующим образом:
report1 = Inputs(filename='Report_1', sep='|', default_path='/PATH/TO/Report_1/')._data()
report2 = Inputs(filename='Report_2', sep='|', default_path='/PATH/TO/Report_2/')._data()
Каждый раз, открывая соединение с SFTP-сервером ...