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

如何在Python中将对象列表实现为实例属性?,python,list,class,oop,relationship,Python,List,Class,Oop,Relationship,我不熟悉Python的OOP。直到现在,我一直使用面向对象语言作为C++、C语言和java。因为我必须将C#模块翻译成Python,所以我遇到了概念上的差异 我有这样的C#类关系: internal class ChirpMeasDataClass { public ChirpMeasDataClass(List<AntennaLevelDataClass> AntennaLevelData, List<DiffphaseDataClass> Diffph

我不熟悉Python的OOP。直到现在,我一直使用面向对象语言作为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] 
  }
或者像这样:

   class ChirpMeasDataClass:
        def __init__(self,antennaLevelDataClass,diffPhaseDataClass):
           self.antennaLevelDataList=[]
           self.diffPhaseDataList=[]
将对象列表作为类中的属性(Python中的实例属性)的常用方法是什么

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

此外,您将两个类定义传递到构造函数中

使用列表(其中内容恰好是这些类的实例)更干净,C++也使用列表,因此它主要是直接等价的。唯一的区别是,在C++中,你必须声明列表的内容是什么类型,而在Python中你不能声明。 在构造函数中,复制传入的列表的内容可能很有用,例如:

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

关键是,否则实例属性引用的列表对象与传入的列表对象相同,如果复制一个,可能会导致意外;Python中没有任何东西是隐式复制的。

C#constructor所做的唯一事情就是将两个参数(对象列表)赋给两个实例属性。其余的大部分是类型注释,在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
”)

Python不是类型化的(脚注,星号,它现在有可选的类型注释…),所以您唯一要做的就是在构造函数中取一个参数并将其分配给属性。就这样。该参数应该是一个只包含特定类型实例的列表,但所有这些都是不相关的,不需要以任何特定方式声明。所以,
def uuuu init_uuuuu(self,a,b):self.a=a;self.b=b
确实是您所需要的一切。“它的值是类定义”–OP在那里用一个参数隐藏名称
AntennaLevelDataClass
”,在Python中您不能“–…在Python中它是可选的[并且不是由运行时强制执行的]。“在Python中没有任何东西是隐式复制的”–对,这就是为什么隐式地在构造函数中复制列表可以说是一种令人惊讶的行为。
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