Как избежать подкласса DataFrame pandas с помощью композиции?

Документация pandas не рекомендует подклассы их структур данных. Одна из рекомендуемых ими альтернатив — использование композиции, но они просто указывают читателям на статью в Википедии о композиции и наследовании. Эта статья и другие ресурсы, которые я нашел, не помогли мне понять, как расширить pandas DataFrame с помощью композиции. Может ли кто-нибудь объяснить композицию в этом контексте и рассказать мне о случаях, когда композиция может быть предпочтительной альтернативой подклассу pd.DataFrame? Простой пример или ссылка на информацию, более поучительную, чем статьи в Википедии, были бы очень полезны.

В этом вопросе я специально спрашиваю, как следует использовать композицию в случаях, когда у кого-то может возникнуть соблазн создать подкласс pd.DataFrame. Я понимаю, что есть другие решения для расширения объекта Python, не связанные с композицией, и я спросил еще один вопрос о расширении pandas DataFrames, которое привело к другому решению с использованием класса-оболочки.


Я не понял, что упаковка и композиция здесь относятся к одному и тому же подходу, как указано в ответе Макса Ярмолинского ниже. ответ на вопрос, на который я ссылался выше, содержит более полное обсуждение использования композиции в этом случае, что может потребовать обработки __getattr__ , __getitem__ и __setitem__ правильно (я понимаю, что это очевидно для людей, которые знают, что они делают, но мне пришлось задать свой предыдущий вопрос, потому что я не смог получить/установить элементы, когда пытался самостоятельно).


person shortorian    schedule 20.12.2020    source источник


Ответы (2)


Просто поиск в Google покажет вам, как создать простой класс, как вы описываете через композицию.

  class mydataframe():
      def __init__(self,data):
          self.coredataframe = pd.DataFrame(data)
          self.otherattribute = None

Затем вы можете добавить свои собственные методы и атрибуты...

person MaxYarmolinsky    schedule 20.12.2020
comment
То есть композиция и упаковка — это одно и то же? - person shortorian; 20.12.2020
comment
да, композиция является примером так называемой обертки. Я не уверен, что упаковка имеет строгое определение, это более общее понятие. - person MaxYarmolinsky; 20.12.2020

В ООП наследование моделей является отношением, в котором модели композиции имеют.

В общем, вы должны стремиться к композиции, а не к наследованию, если вы не имеете в виду конкретный полиморфный дизайн, поскольку он менее тесно связан и более модульен. Наследование — это самая сильная связь, которую вы можете создать. А сильная связанность приводит к трудностям в сопровождении (все взаимосвязано и трудно отделить), тогда как композицию намного легче рефакторить.

Наследование также может привести к путанице в иерархии наследования, если не соблюдать осторожность при проектировании или проектирование является инкрементальным.

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

person Greg    schedule 20.12.2020