【问题标题】:Define an attribute with a dataclass method in Python在 Python 中使用数据类方法定义属性
【发布时间】:2020-05-13 04:27:01
【问题描述】:

我有一个用于边界框坐标的类,我想将其转换为数据类,但我不知道如何像在普通类中那样使用类方法设置属性。这是普通的类:

class BBoxCoords:
    """Class for bounding box coordinates"""
    def __init__(self, top_left_x: float, top_left_y: float, bottom_right_x: float, bottom_right_y: float):
        self.top_left_x = top_left_x
        self.top_left_y = top_left_y
        self.bottom_right_x = bottom_right_x
        self.bottom_right_y = bottom_right_y
        self.height = self.get_height()

    def get_height(self) -> float:
        return self.bottom_right_y - self.top_left_y

这就是我想要它做的事情:

bb = BBoxCoords(1, 1, 5, 5)
bb.height
> 4

这正是我想要的。我尝试对数据类做同样的事情

from dataclasses import dataclass    

@dataclass
class BBoxCoords:
    """Class for bounding box coordinates"""
top_left_x: float
top_left_y: float
bottom_right_x: float
bottom_right_y: float
height = self.get_height()

def get_height(self) -> float:
    return self.bottom_right_y - self.top_left_y

但是当我尝试使用 self 时没有定义它,所以我得到了一个 NameError。使用数据类执行此操作的正确方法是什么?我知道我能做到

bb = BBoxCoords(1, 1, 5, 5)
bb.get_height()
> 4

但我宁愿调用属性而不是方法。

【问题讨论】:

    标签: python python-3.x python-dataclasses


    【解决方案1】:

    对于这类事情,您需要__post_init__,它将在__init__之后运行。另外,请确保height 未在__init__ 中设置,因此:

    from dataclasses import dataclass, field   
    
    @dataclass
    class BBoxCoords:
        """Class for bounding box coordinates"""
        top_left_x: float
        top_left_y: float
        bottom_right_x: float
        bottom_right_y: float
        height: float = field(init=False)
    
        def __post_init__(self):
            self.height = self.get_height()
    
        def get_height(self) -> float:
            return self.bottom_right_y - self.top_left_y
    

    在行动:

    In [1]: from dataclasses import dataclass, field
       ...:
       ...: @dataclass
       ...: class BBoxCoords:
       ...:     """Class for bounding box coordinates"""
       ...:     top_left_x: float
       ...:     top_left_y: float
       ...:     bottom_right_x: float
       ...:     bottom_right_y: float
       ...:     height: float = field(init=False)
       ...:
       ...:     def __post_init__(self):
       ...:         self.height = self.get_height()
       ...:
       ...:     def get_height(self) -> float:
       ...:         return self.bottom_right_y - self.top_left_y
       ...:
    
    In [2]: BBoxCoords(1, 1, 5, 5)
    Out[2]: BBoxCoords(top_left_x=1, top_left_y=1, bottom_right_x=5, bottom_right_y=5, height=4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-24
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 2021-06-17
      • 1970-01-01
      相关资源
      最近更新 更多