Drilling down in a dict with "complex" objects
Chris Rebert
clp2 at rebertia.com
Tue May 25 01:33:44 EDT 2010
On Mon, May 24, 2010 at 9:34 PM, Six <john.d.perkins at 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
More information about the Python-list
mailing list