How can I make an instance of a class act like a dictionary?


J

John Salerno

Hi everyone. I created a custom class and had it inherit from the
"dict" class, and then I have an __init__ method like this:

def __init__(self):
self = create()

The create function creates and returns a dictionary object. Needless
to say, this is not working. When I create an instance of the above
class, it is simply an empty dictionary rather than the populated
dictionary being created by the create function. Am I doing the
inheritance wrong, or am I getting the above syntax wrong by assigning
the return value to self?

I know I could do self.variable = create() and that works fine, but I
thought it would be better (and cleaner) simply to use the instance
itself as the dictionary, rather than have to go through an instance
variable.

Thanks.
 
Ad

Advertisements

C

Chris Rebert

Hi everyone. I created a custom class and had it inherit from the
"dict" class, and then I have an __init__ method like this:

def __init__(self):
       self = create()

The create function creates and returns a dictionary object. Needless
to say, this is not working. When I create an instance of the above
class, it is simply an empty dictionary rather than the populated
dictionary being created by the create function. Am I doing the
inheritance wrong, or am I getting the above syntax wrong by assigning
the return value to self?

Assignment to `self` has no effect outside the method in question;
Python uses call-by-object (http://effbot.org/zone/call-by-object.htm
) for argument passing.
Even in something like C++, I believe assignment to `this` doesn't work.
I know I could do self.variable = create() and that works fine, but I
thought it would be better (and cleaner) simply to use the instance
itself as the dictionary, rather than have to go through an instance
variable.

Call the superclass (i.e. dict's) initializer (which you ought to be
doing anyway):
super(YourClass, self).__init__(create())

Cheers,
Chris
 
D

Dan Sommers

Hi everyone. I created a custom class and had it inherit from the "dict"
class, and then I have an __init__ method like this:
I know I could do self.variable = create() and that works fine, but I
thought it would be better (and cleaner) simply to use the instance
itself as the dictionary, rather than have to go through an instance
variable.

Check out the "Bunch" class:

http://code.activestate.com/recipes/52308/

HTH,
Dan
 
J

John Salerno

Assignment to `self` has no effect outside the method in question;
Python uses call-by-object (http://effbot.org/zone/call-by-object.htm
) for argument passing.
Even in something like C++, I believe assignment to `this` doesn't work.


Call the superclass (i.e. dict's) initializer (which you ought to be
doing anyway):
    super(YourClass, self).__init__(create())

Cheers,
Chris
--http://rebertia.com

Thanks. This ended up working:

def __init__(self):
self = super().__init__(create_board())

Is that what you meant for me to do? Why did assigning to self work in
this case, but not the original case?
 
Ad

Advertisements

B

Benjamin Kaplan

Thanks. This ended up working:

def __init__(self):
       self = super().__init__(create_board())

Is that what you meant for me to do? Why did assigning to self work in
this case, but not the original case?


It didn't do anything and still isn't doing anything.

In Python, names are assigned to objects


self -> <Object1>
^
foo -------|

Reassigning a name does not change the value, so
self = create()

Just makes an object2

self -> <Object2>

foo ---> <Object1>

The reason it's working here is because the super().__init__() call
modifies the existing object in place. It returns None, so you're
setting self = None but that doesn't matter because of what I
explained before about how assigning to self doesn't actually change
anything.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top