Как преобразовать код в базовом скрипте в класс с экземплярами? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть базовый сценарий Python, который мне нужно преобразовать в класс и создать несколько экземпляров этого класса.

В сценарии есть несколько глобальных держателей данных, которые функции модифицируют.Глобальные переменные выглядят примерно так:

# a global list
list_1 = [...]
# a global dictionary
dict_1 = {...}
# a global pandas dataframe
df_1 = pd.DataFrame(...)

У меня есть одна основная функция (которая выполняет самые важные задачи) и множество вспомогательных функций для конкретных задач, которые основная функция вызывает при необходимости.Примерно так:

# main function
def  main_def():
    global list_1, dict_1, df_1
    aux_def_1 (list_1, df_1)
    aux_def_2 (dict_1, df_1)

# auxiliary function 1
def  aux_def_1 ()
    global list_1, dict_1, df_1
    ...

# auxiliary function 2  
def  aux_def_2 ()
    global list_1, dict_1, df_1
    ...

Я использую приведенный выше скрипт в блокноте jupyter следующим образом:

import script as scr

scr.main_def()

scr.aux_def_1()
scr.aux_def_2()

scr.list_1
scr.dict_1
scr.df_1

Теперь мне нужно создать несколько основных функций, таких как приведенные выше, и большинство глобальных функций.переменные и вспомогательные функции останутся прежними.

Один из способов сделать это - создать базовый класс, определяющий глобальные переменные и вспомогательные функции, а затем создать экземпляры этого класса.У каждого экземпляра будет своя основная функция.

Каков наилучший способ сделать это с минимальными изменениями в существующем коде?

РЕДАКТИРОВАТЬ: Можно ли организовать дело следующим образом:

class BaseClass:
    # BaseClass list
    list_1 = [...]
    # BaseClass dictionary
    dict_1 = {...}
    # BaseClass pandas dataframe
    df_1 = pd.DataFrame(...)

    # BaseClass auxiliary function 1
    def  aux_def_1 ()

    # BaseClass auxiliary function 2  
    def  aux_def_2 ()

class MainDef_1(BaseClass)
    def __init__(self, parameter1, parameter2, parameter3):
        self.parameter1 = parameter1
        self.parameter2 = parameter2
        self.parameter3 = parameter3

class MainDef_2(BaseClass)
    def __init__(self, parameter1, parameter3, parameter4):
        self.parameter1 = parameter1
        self.parameter3 = parameter3
        self.parameter4 = parameter4

1 Ответ

0 голосов
/ 06 октября 2018

Это может быть слишком упрощенно (или я до сих пор не понимаю деталей того, что вы хотите сделать, но похоже, что такой подход будет работать).

class BaseClass:
    list_1 = [...]
    dict_1 = {...}
    df_1 = pd.DataFrame(...)

    def aux_def_1(self):
        pass

    def aux_def_2(self):
        pass


class MainDef_1(BaseClass)
    def __init__(self, parameter1, parameter2, parameter3):
        self.parameter1 = parameter1
        self.parameter2 = parameter2
        self.parameter3 = parameter3

    def main(self):
        # whatever this version does...for example.
        self.list_1  # Accesses attribute of base class.
        x = self.parameter1 + 42  # Accesses attribute of this class.


class MainDef_2(BaseClass)
    def __init__(self, parameter1, parameter3, parameter4):
        self.parameter1 = parameter1
        self.parameter3 = parameter3
        self.parameter4 = parameter4

    def main(self):
        # whatever this version does...for example.
        result = self.aux_def_2()  # Use method defined in base class.
        y = self.parameter4 + 13  # Accesses attribute of this class.

Каждый подкласс определяет свой собственныйmain() метод.В нем на необходимые параметры можно ссылаться через parameterN, а также на данные и методы базового класса (опять же, просто добавив к их именам префикс "self.".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...