属性的属性:point.coord、point.coord.x和point.coord.y

2024-10-06 11:17:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我不知道如何精确地表达它,但我想创建一个类Point,通过该类,点的坐标既可以作为元组访问,也可以单独访问,如下所示:

point.coord
# tuple (x,y)

point.coord.x
point.coord.y
# coordinates x and y

我是否必须声明一个方法point.coord(),或者是否存在属性的属性?还有,出于其他目的,较长的嵌入属性(object.attr1.attr2.attr3)如何


Tags: and方法目的声明属性objectpoint元组
2条回答
class Coord(tuple):
    def __init__(self, points):
        self.x, self.y = points

class Point:
    def __init__(self, *points):
        self.coord = Coord(points)


point = Point(1, 2)

print(point.coord)
print(point.coord.x)
print(point.coord.y)

这里有一个小窍门给你。如果从tuple继承,那么返回类型仍然可以是tuple,那么只需要Point的包装器和访问tuple属性的方法。这可以通过namedtuple或者像这样做:

In [52]: class Coord(tuple):
    ...:     def __init__(self, xy):
    ...:         super().__init__()
    ...:         x, y = xy
    ...:         self._x = x
    ...:         self._y = y
    ...:     @property
    ...:     def x(self):
    ...:         return self._x
    ...:     @property
    ...:     def y(self):
    ...:         return self._y
    ...:

In [53]: class Point:
    ...:     def __init__(self, coord: Coord):
    ...:         self.coord = coord
    ...:

In [54]: p = Point(Coord((5,12)))

In [55]: p.coord
Out[55]: (5, 12)

In [56]: p.coord.x
Out[56]: 5

In [57]: p.coord.y
Out[57]: 12

相关问题 更多 >