2013-01-03 136 views
0

我对python相当陌生(并且对Python OO来说是全新的),但是我正在处理一个相当复杂的类,我正努力去理解,但是我需要编辑它。为了帮助理解发生了什么,我试图从对象中提取数据,但是我所做的只是返回“地址处的类名对象”。访问Python对象数据

有人能向我解释,我怎么会去印刷,说,在这个对象顶点领域:

class Halfedge(object): 
    def __init__(self, edge=None, marker=Edge.LEFT): 
     self.left = None # left Halfedge in the edge list 
     self.right = None # right Halfedge in the edge list 
     self.qnext = None # priority queue linked list pointer 
     self.edge = edge # edge list Edge 
     self.marker = marker 
     self.vertex = None # Site() 
     self.ystar = BIG_FLOAT 

    def __eq__(self, other): 
     return self.ystar == other.ystar and \ 
       self.vertex.x == other.vertex.x 

    def __lt__(self, other): 
     if self.ystar == other.ystar: 
      return self.vertex.x < other.vertex.x 
     else: 
      return self.ystar < other.ystar 

    def left_reg(self, default): 
     if not self.edge: 
      return default 
     elif self.marker == Edge.LEFT: 
      return self.edge.reg[Edge.LEFT] 
     else: 
      return self.edge.reg[Edge.RIGHT] 

    def right_reg(self, default): 
     if not self.edge: 
      return default 
     elif self.marker == Edge.LEFT: 
      return self.edge.reg[Edge.RIGHT] 
     else: 
      return self.edge.reg[Edge.LEFT] 

    def is_point_right_of(self, point): 
     """Returns True if <point> is to right of halfedge. 
     """ 
     edge = self.edge 
     topsite = edge.reg[1] 
     right_of_site = point.x > topsite.x 

     if(right_of_site and self.marker == Edge.LEFT): 
      return True 

     if(not right_of_site and self.marker == Edge.RIGHT): 
      return False 

     if(edge.a == 1.0): 
      dyp = point.y - topsite.y 
      dxp = point.x - topsite.x 
      fast = 0 
      if ((not right_of_site and edge.b < 0.0) or \ 
       (right_of_site and edge.b >= 0.0)): 
       above = dyp >= edge.b * dxp 
       fast = above 
      else: 
       above = point.x + point.y * edge.b > edge.c 
       if(edge.b < 0.0): 
        above = not above 
       if (not above): 
        fast = 1 
      if (not fast): 
       dxs = topsite.x - (edge.reg[0]).x 
       above = (edge.b * (dxp*dxp - dyp*dyp)) < \ 
         (dxs*dyp*(1.0+2.0*dxp/dxs + edge.b*edge.b)) 
       if(edge.b < 0.0): 
        above = not above 
     else: # edge.b == 1.0 
      yl = edge.c - edge.a * point.x 
      t1 = point.y - yl 
      t2 = point.x - topsite.x 
      t3 = yl - topsite.y 
      above = t1*t1 > t2*t2 + t3*t3 

     if(self.marker == Edge.LEFT): 
      return above 
     else: 
      return not above 

    def intersect(self, other): 
     """Create a new site where the Halfedges edge1 and edge2 intersect. 
     """ 
     edge1 = self.edge 
     edge2 = other.edge 
     if (edge1 is None) or (edge2 is None): 
      return None 

     # if the two edges bisect the same parent return None 
     if edge1.reg[1] is edge2.reg[1]: 
      return None 

     d = edge1.a * edge2.b - edge1.b * edge2.a 
     if almost_equal(d, 0.0): 
      return None 

     intersect_x = (edge1.c * edge2.b - edge2.c * edge1.b)/d 
     intersect_y = (edge2.c * edge1.a - edge1.c * edge2.a)/d 
     if edge1.reg[1] < edge2.reg[1]: 
      halfedge = self 
      edge = edge1 
     else: 
      halfedge = other 
      edge = edge2 

     right_of_site = intersect_x >= edge.reg[1].x 
     if ((right_of_site and halfedge.marker == Edge.LEFT) or 
      (not right_of_site and halfedge.marker == Edge.RIGHT)): 
      return None 

     # create a new site at the point of intersection - this is a new 
     # vector event waiting to happen 
     return Site((intersect_x, intersect_y)) 

我知道这是很简单的东西,但感谢任何帮助。

编辑:我使用了完整的类,可以发现:

https://bitbucket.org/mozman/geoalg/src/5bbd46fa2270/geoalg/voronoi.py

+1

那么,你到目前为止尝试过什么? – gmlobdell

+0

还有什么“矢量变量”?只有一个“顶点”字段*(不是“变量”)。 – Colleen

+0

对不起,拼写错误,这是我想返回的顶点字段。如果我理解正确,它应该返回,或者成为一个指向一个ooordinate的指针。我将编辑主帖子,以便链接到整个班级。 – djcmm476

回答

1

假设你有一个半边实例 - 我们称之为my_halfedge - 您访问其任何属性的用点号。所以,对于vertex属性,你会做my_halfedge.vertex

+0

嗯,我尝试过使用班级创建的平分线。它返回“地址处的voronoi.Site对象”。那么我是否必须在Site对象中找到要添加到打印语句结尾的属性? – djcmm476

+0

要查找对象的属性,可以执行'dir(my_halfedge.vertex)' - 然后仅在另一个点之后添加该属性,例如'my_halfedge.vertex.my_attribute'。 –

+0

啊,这似乎已经做到了。非常感谢。尽管在python上花费了合理的时间,但我却设法完全避免了面向对象的编程。 – djcmm476

1

为了让半边的实例做,例如,

he2 = Halfedge() 

和打印顶点做

print he2.vertex 

的这个实例的值在此之后你在做什么?