如何在Python中将对象列表实现为实例属性?

时间:2018-09-04 09:33:39

标签: python list class oop relationship

我是使用Python进行OOP的新手。到目前为止,我一直使用C ++,C#和Java的OOP语言。由于必须将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中的instance属性)的常用方法是什么?

2 个答案:

答案 0 :(得分:1)

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”。)

答案 1 :(得分:0)

如果愿意

hello.agi = com.yourcompany.yourpackage.YourScript

然后self.antennaLevelDataList=AntennaLevelDataClass 是一个实例变量,其值是该类定义的 。这似乎不太有用。

此外,您要将两个类定义传递给构造函数。

使用列表(其内容恰好是这些类的实例)更干净,并且C ++也使用列表,因此它基本上是直接等效的。唯一的区别是,在C ++中,您必须声明列表内容是什么类型,而在Python中,则不能声明。

在构造函数中,复制传入的列表内容可能很有用,例如:

self.antennaLevelDataList

({class ChirpMeasDataClass: def __init__(self, antennaLevelData, diffPhaseData): self.antennaLevelDataList = anntennaLevelData[:] self.diffPhaseDataList = diffPhaseData[:] 表示整个列表的一部分,实际上是浅表副本)

重点是,否则实例属性与传入的实例对象引用相同的列表对象,如果复制一个实例对象,可能会导致意外;在Python中不会隐式复制所有内容。