Python的类

格式化输出类内的数据内容

  • 使用默认的__repr__方法
 def __repr__(self):
    return "Prop 1: " + str(self.prop1)+", Prop 2: "+str(self.prop2)

构建数据类型(使用dataclass)

使用dataclass创建复合数据类型

  • 引用dataclassesdataclassfield
  • list、dict等类型需要使用default_factory初始化
    from dataclasses import dataclass, field
     
    @dataclass
    class TestType:
        str_type: str = None
        np_type: np.ndarray = None
        value_type: float = None
        list_type: list = field(default_factory=lambda: [False]*6)

数据类型的嵌套

  • 如果为多层嵌套,其内部所嵌套的每层声明应当用field进行初始化,否则会导致声明指向同一变量(Python stores default member variable values in class attributes.), 参考
    • 正确示例 输出为12
    from dataclasses import dataclass, field
     
    ## inner most data
    @dataclass
    class Lv0:
        x: float=0
    ## the structure in the middle
    @dataclass
    class Lv1:
        y0: Lv0 = field(default_factory=lambda: Lv0()) # not y0: Lv0 = Lv0()
     
    ## outer most data
    @dataclass
    class Lv2:
        z0: Lv1 = field(default_factory=lambda: Lv1())
     
    if __name__ == '__main__':
        a = Lv2()
        b = Lv2()
        a.z0.y0.x = 1
        b.z0.y0.x = 2
        print(a.z0.y0.x) ## get 1
        print(b.z0.y0.x) ## get 2
    • 错误示例,ab.z0.y0指向了同一变量,输出为22
    from dataclasses import dataclass, field
     
    @dataclass
    class Lv0:
        x: float=0
     
    @dataclass
    class Lv1:
        y0: Lv0 = Lv0()
     
    @dataclass
    class Lv2:
        z0: Lv1 = field(default_factory=lambda: Lv1())
     
    if __name__ == '__main__':
        a = Lv2()
        b = Lv2()
        a.z0.y0.x = 1
        b.z0.y0.x = 2
        print(a.z0.y0.x) ## get 2
        print(b.z0.y0.x) ## get 2