On Mon, May 24, 2010 at 9:34 PM, Six <john.d.perk...@gmail.com> wrote: > I am trying to access an objects sub-object attributes. I can boil the > code I am working with down to this problem section: > (snip) > class Pt: > x = None > y = None > def __init__(self, x, y): > self.x, self.y = x, y > pass > > class Pts: > curr_point = None > next_point = None > def __init__(self, n, m): > self.next_point = Pt(n, m) > def update(self, point): > self.curr_point = self.next_point > self.next_point = point > > class PtManage: > points = {} > def __init__(self): > pass > > point = Pts(3,5) > pman = PtManage() > pman.points["odds"] = point > print dir(pman) > > print pman["odds"].next_point.x > > (snip) > > It's this last line that doesn't work. What am I doing wrong? Is this > a failure of the design or am I missing something obvious? How do I > get down and see that "Pt" classes x attribute within the PtManage > dict?
I suggest you read the part of Python's tutorial concerning classes (http://docs.python.org/tutorial/classes.html ). Note that "curr_point = None" and similar at the class level *does not* declare an object field, because Python does not have instance variable declarations. Here is a fixed and normalized version of the classes in your example: class Pt(object): def __init__(self, x, y): self.x, self.y = x, y class Pts(object): def __init__(self, n, m): self.curr_point = None self.next_point = Pt(n, m) def update(self, point): self.curr_point = self.next_point self.next_point = point class PtManage(object): def __init__(self): self.points = {} As for why your last line fails: > print pman["odds"].next_point.x As Sean said, you're missing a ".points": print pman.points["odds"].next_point.x Also, is there any reason for PtManage over just using a `points` dictionary directly? Cheers, Chris -- http://blog.rebertia.com -- http://mail.python.org/mailman/listinfo/python-list