Как сохранить родительский объект конфигурации во всех экземплярах дочернего объекта в Python? - PullRequest
0 голосов
/ 15 апреля 2020

Я новичок в 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-сервером ...

1 Ответ

1 голос
/ 15 апреля 2020

Используйте состав / делегирование вместо наследования и явно передавайте свой экземпляр SFTP в экземпляры Inputs. Simplisti c пример композиции / делегирования:

class Delegatee(object):
    def __init__(self, arg1, arg2):
        self.arg1 = arg1
        self.arg2 = arg2

    def do_this(self, arg):
        return (arg * self.arg1) + self.arg2


class Delegator(object):
    def __init__(self, arg, delegatee):
        self.arg = arg
        self.delegatee = delegatee

    def do_this(self, arg):
        return self.delegatee.do_this(self.arg + arg)


delegatee = Delegatee(1, 42)
delegator = Delegator(0, delegatee)
print(delegator.do_this(0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...