【问题标题】:How to use __repr__ method python 2.7如何使用 __repr__ 方法 python 2.7
【发布时间】:2015-07-29 23:57:32
【问题描述】:

我需要在 2D 中定义一类多边形。 每个多边形由元组(坐标)列表定义,例如:

poly = [(0.5,0),(1,0.5),(0.5,1),(0,0.5)]

(无需排序) 这些点从最左边的点开始按顺时针方向排序。

我的任务是正确定义这个类 __init____repr__is_inside(self, q) 函数检查点是否在多边形内。

__repr__ 方法假定打印 '[(0.5,0),(1,0.5),(0.5,1),(0,0.5)]'

到目前为止,这是我所拥有的:

class Polygon2D:
    def __init__(self, pts):
        for index in range(len(pts)):
            self.index = pts[index]
    def __repr__(self):

        return str(self)

当我尝试运行它时,程序崩溃了。请帮帮我!!

【问题讨论】:

    标签: python python-2.7 repr


    【解决方案1】:

    str(self) 调用self.__str__,它将委托给self.__repr__,在您的实现中调用str(self),重新开始整个循环。所以是的,你导致了无限递归。

    然而,您更直接的问题是存储pts 列表。您只存储最后一点,丢弃其余的。在循环中分配给self.index 只会导致最后一个分配获胜。

    只需将pts 直接存储为属性,然后将that 转换为字符串作为__repr__ 的结果:

    class Polygon2D:
        def __init__(self, pts):
            self.points = pts
    
        def __repr__(self):
            return str(self.points)
    

    存储完整的点列表也可以实现您的is_inside 函数。

    【讨论】:

    • 首先感谢您的回答:) 但我不需要轻松访问每一点吗?例如:poly.1 = (0,0.5) 记住它们是以特定方式排序的
    • 如果您将[(0.5,0),(1,0.5),(0.5,1),(0,0.5)] 传递给__init__() 方法,您将可以轻松获得积分。您需要做的就是poly.points[<whatever_index>],就像处理未分配给类实例的普通列表一样。假设您首先执行poly = Polygon2D(your_points_list) 之类的操作
    • @ofersimchovitch:只需访问self.points[0] 等即可索引您的所有积分。列表保留顺序。不要尝试为每个索引创建新属性。
    猜你喜欢
    • 2013-11-24
    • 2020-02-20
    • 2021-09-11
    • 2020-10-04
    • 2020-05-14
    • 2019-06-06
    • 2019-09-18
    • 2020-08-27
    • 2017-08-06
    相关资源
    最近更新 更多