Композиция с делегированием и абстрактными классами и методамиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Композиция с делегированием и абстрактными классами и методами

Сообщение Anonymous »

У меня есть два класса: один, который читает файлы определенного типа (растры, например .tif, которые представляют собой изображения с одним или несколькими каналами) и выполняет операцию, специфичную для этого типа файлов (повторная выборка в соответствии с заданный размер) и вернуть их в виде массива numpy. Если мы передаем один файл, он просто читает его, выполняет повторную выборку, если необходимо, и возвращает его в виде массива. Если мы передаем список файлов, он читает их один за другим, при необходимости выполняет повторную выборку и добавляет их в список массивов. На этом этапе, в соответствии с параметром mode, он выполняет либо операцию A над списком, либо операцию B, и в обоих случаях он возвращает один массив.
Вот псевдокод:

Код: Выделить всё

class Raster():

def __init__(self, filepaths, size, mode):
self.filepaths = filepaths
self.size = size
self.mode = mode

def __getitem__(self):
if not isinstance(self.filepaths, list):
array = ... # read the file into array
if array.size != self.size:
array = self.resample(array)

else:
arrays = []
for filepath in self.filepaths:
array = ... # read the file into array
if array.size != self.size:
array = self.resample(array)
arrays.append(array)

if self.mode == "A":
array = self.operation_A(arrays)
elif self.mode == "B":
array = self.operation_B(arrays)
else:
# raise an error

return array

def resample(self, array):
# resample to `self.size`
return resampled_array

def operation_A(self, arrays):
# perform operation A on list of arrays and return one array
return array

def operation_B(self, arrays):
# perform operation B on list of arrays and return one array
return array
Второй класс очень похож на первый, но читает векторные файлы, например. .geojson, и он растрирует их в массивы заданного размера, поэтому повторная выборка не требуется. Однако, как и предыдущий класс, он может получать список файлов и выполнять те же операции A или B над списком растровых массивов и возвращать один массив.
Вот псевдокод:

Код: Выделить всё

class Vector():

def __init__(self, filepaths, size, mode):
self.filepaths = filepaths
self.size = size
self.mode = mode

def __getitem__(self):
if not isinstance(self.filepaths, list):
polygons = ... # read the vector file
array = self.rasterize(polygons)

else:
arrays = []
for filepath in self.filepaths:
polygon = ... # read the vector files
array = self.rasterize(polygons)
arrays.append(array)

if self.mode == "A":
array = self.operation_A(arrays)
elif self.mode == "B":
array = self.operation_B(arrays)
else:
# raise an error

return array

def rasterize(self, polygons):
# rasterize the polygons into an array of `self.size`
return rasterized_array

def operation_A(self, arrays):
# perform operation A on list of arrays and return one array
return array

def operation_B(self, arrays):
# perform operation B on list of arrays and return one array
return array
У меня такое ощущение, что композиция (условное наследование на основе аргументов в Python) — лучший выбор, чем наследование, из-за ее гибкости, но я не знаю, следует ли и как мне создавать классы class Operation_A() и класс Operation_B() с их методом def perfom_operation() и делегируйте этому методу классы Raster и Vector.< /p>
Кроме того, следует классы Operation_A() и Operation_B() должны быть абстрактными (зачем использовать абстрактные базовые классы в Python?)? И их метод? Должен ли это быть @abstractmethod или @classmethod?


Подробнее здесь: https://stackoverflow.com/questions/792 ... nd-methods
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Композиция с делегированием и абстрактными классами и методами
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между абстрактными классами и интерфейсами в Java?
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Полиморфная десериализация Джексона с несколькими абстрактными классами
    Anonymous » » в форуме JAVA
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Полиморфная десериализация Джексона с несколькими абстрактными классами
    Anonymous » » в форуме JAVA
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Полиморфная десериализация Джексона с несколькими абстрактными классами
    Anonymous » » в форуме JAVA
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»