Лучше ли создавать унаследованный класс или класс, который инициализируется с использованием экземпляра родительского объекта? - PullRequest
0 голосов
/ 16 октября 2019

Мне нравится Python для относительного импорта между модулями и краткости кода. При выполнении операций с большим количеством наборов данных я бы использовал Python в качестве основного фреймворка, тогда тяжелые в вычислительном отношении части могли бы обрабатываться модулями plug and play, написанными на более быстрых языках, таких как FORTRAN.

В моем текущем состоянии яиметь пакет с именем sigmareader, который по сути является классом;класс определен в __init__.py, в то время как методы вызываются из соответствующих пакетов. Структура sigmareader показана ниже:

sigmareader
├── __init__.py
├── _reader
│   ├── ...
├── ...

Чтобы прочитать мои данные, я создаю экземпляр sigmareader и использую метод reader. Считанные данные хранятся в подходящей форме в атрибуте self экземпляра.

Само по себе это довольно сложная вычислительная задача. Теперь, когда данные прочитаны и сохранены, я хотел бы перейти к расчету продукта. Я предполагаю, что вычисление продукта будет одинаково сложным и вычислительно тяжелым, поэтому я хотел бы сделать его отдельным пакетом, называемым sigmaproduct:

sigmaproduct
├── __init__.py
├── _cloudproduct
│   ├── ...
├── ...

Для расчета продукта требуется ввод данных чтения, которые хранятся в случае sigmareader. Я вижу три способа сделать это.

Первый подход Сделать sigmaproduct дочерним классом sigmareader.

Для иллюстрации рабочего процесса:

sigmaproduct_ins = sigmaproduct()

for dataset in dataset_lst:
    sigmaproduct_ins.reader(dataset) # storing read data in instance
    sigmaproduct_ins.cloudproduct() # reading and storing cloudproduct in instance

    ...further operations

Второй подход Сделать sigmaproduct независимым классом, который инициализируется с использованием экземпляра sigmareader. Там, где этот экземпляр sigmareader уже активировал свои методы;то есть он уже сохранил прочитанные данные под атрибутом self.

Чтобы проиллюстрировать рабочий процесс:

sigmareader_ins = sigmareader()

for dataset in dataset_lst:
    sigmareader_ins.reader(dataset) # storing read data in instance
    sigmaproduct_ins = sigmaproduct(sigmareader_ins) # creating instance of sigmaproduct
    sigmaproduct_ins.cloudproduct() # reading and storing cloudproduct in instance

    ...further operations

Третий подход Сделать sigmaproduct независимым классом, он инициализируется как универсальный объект так же, как sigmareader;т.е. его инициализация не зависит от набора данных. Вместо этого методы sigmaproduct потребовали бы ввода экземпляра sigmareader для вычисления продуктов.

Для иллюстрации рабочего процесса:

sigmareader_ins = sigmareader()
sigmaproduct_ins = sigmaproduct()

for dataset in dataset_lst:
    sigmareader_ins.reader(dataset) #storing read data in instance
    sigmaproduct_ins.cloudproduct(sigmareader_ins) #computing and storing data stored in sigmareader_ins

    ... futher operations

Со многими различнымиметоды в каждом пакете, я хотел бы как можно больше сохранить sigmareader и sigmaproduct как независимые классы, поэтому я предпочитаю не использовать Первый подход .

Однако, dataset_lst содержит БОЛЬШОЕ число dataset с, поэтому я ищу наиболее оптимальный в вычислительном отношении подход. Который лучший? Каковы плюсы и минусы каждого подхода? Есть ли другие, более оптимальные подходы, которые я упускаю?

...