Как реализовать список объектов в качестве атрибута экземпляра в Python? - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в ООП с Python. До сих пор я работал с языками ООП, такими как C ++, C # и Java. Поскольку мне пришлось перевести модуль C # на Python, я столкнулся с концептуальными различиями.

У меня есть отношения класса C #:

 internal class ChirpMeasDataClass
  {
     public ChirpMeasDataClass(List<AntennaLevelDataClass> AntennaLevelData, List<DiffphaseDataClass> DiffphaseData)
     {
        this.AntennaLevelData = AntennaLevelData;
        this.DiffphaseData = DiffphaseData;
     }
     internal List<AntennaLevelDataClass> AntennaLevelData = new List<AntennaLevelDataClass>();
     internal List<DiffphaseDataClass> DiffphaseData = new List<DiffphaseDataClass>();
  }
  internal class AntennaLevelDataClass
  {
     internal double dLevel =  -10000;          // [dB]
     internal double dVarianzLevel = -10000;  // [dB^2]
  }
  internal class DiffphaseDataClass
  {
     internal double dDiffPhase = -10000;         // [°] 
     internal double dVarianzDiffPhase = -10000; // [°^2] 
  }

Что интуитивно приходит на ум в Python, так это иметь что-то вроде этого:

class AntennaLevelDataClass:
    def __init__(self):
        self.dLevel = -10000  # [dB]
        self.dVarianzLevel = -10000  # [dB ^ 2]

class DiffPhaseDataClass:
    def __init__(self):
        self.dDiffPhase = -10000 # [°]
        self.dVarianzDiffPhase = -10000 # [° ^ 2]

class ChirpMeasDataClass:
    def __init__(self,AntennaLevelDataClass,DiffPhaseDataClass):
       self.antennaLevelDataList=AntennaLevelDataClass
       self.diffPhaseDataList=DiffPhaseDataClass

или как-то так:

   class ChirpMeasDataClass:
        def __init__(self,antennaLevelDataClass,diffPhaseDataClass):
           self.antennaLevelDataList=[]
           self.diffPhaseDataList=[]

Каков обычный способ иметь список объектов в качестве атрибута в классе (атрибут экземпляра в Python)?

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Единственное, что делает конструктор C #, это назначает два аргумента, которые являются списками объектов, двум свойствам экземпляра. Остальные в основном аннотации типов, которые в Python являются необязательными. Итак, основная вещь, которую вы хотите, это просто:

class ChirpMeasData:
    def __init__(self, antenna_level_data, diff_phase_data):
       self.antenna_level_data = antenna_level_data
       self.diff_phase_data = diff_phase_data

Вы можете добавить аннотации типов:

from typing import List

class ChirpMeasData:
    def __init__(self, antenna_level_data: List[AntennaLevelData],
                 diff_phase_data: List[DiffphaseData]):
       self.antenna_level_data = antenna_level_data
       self.diff_phase_data = diff_phase_data

(Обратите внимание, что я отказываюсь от избыточного использования "Class" в именах классов здесь.)

0 голосов
/ 04 сентября 2018

Если вы делаете

self.antennaLevelDataList=AntennaLevelDataClass

Тогда self.antennaLevelDataList является переменной экземпляра, и ее значение этого определения класса . Это не кажется очень полезным.

Кроме того, вы передаете два определения классов в конструктор.

Использование списков (содержимое которых является экземпляром этих классов) намного чище, и C ++ также использует списки, так что это в основном прямой эквивалент. Единственное отличие состоит в том, что в C ++ вы должны объявить, какого типа содержимое списка, а в Python - нет.

В конструкторе, вероятно, полезно скопировать содержимое переданных списков, что-то вроде:

class ChirpMeasDataClass:
    def __init__(self, antennaLevelData, diffPhaseData):
        self.antennaLevelDataList = anntennaLevelData[:]
        self.diffPhaseDataList = diffPhaseData[:]

([:] обозначает фрагмент всего списка, фактически мелкая копия)

Дело в том, что в противном случае атрибуты экземпляра ссылаются на тот же объект списка, что и переданные, и это может привести к неожиданностям при копировании; в Python ничего не копируется неявно.

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