Need help with simple OOP Python question

Ben Finney ben+python at benfinney.id.au
Mon Sep 5 09:26:51 CEST 2011


Kristofer Tengström <krille012 at gmail.com> writes:

> Hi, I'm having trouble creating objects that in turn can have custom
> objects as variables.

That terminology is rather confused.

I think what you want is to have instances with their own attributes.

> class A:
>     sub = dict()

This binds a single object (a new empty dict) to the class attribute
‘sub’. Every instance of class ‘A’ will share the same attribute, and
hence that same dict.

>     def sub_add(self, cls):

This defines a function which will be bound to the class attribute
‘sub_add’. It will, when later called as a method, receive the instance
as the first parameter, bound to the local name ‘self’.

>         obj = cls()
>         self.sub[obj.id] = obj

Here, ‘self’ will be an instance of the ‘A’ class. Each instance has no
‘sub’ attribute, so Python will find the class attribute ‘A.sub’, shared
by all ‘A’ instances. You're then modifying that class attribute ‘A.sub’.

[…]

> Now, what I get from this is the following:
> <__main__.B instance at 0x01FC20A8>
> <__main__.B instance at 0x01FC20A8>
> Why is this?

I hope the above explains it.

> What I want is for them to be two separate objects, but it seems like
> they are the same one.

Yes. Anything you talk about in the class definition scope cannot know
about any instance of that class, since the instances don't exist yet.

Instead, instance attributes need to be bound to a particular instance,
which means you need to have a reference to the instance; that's what
‘self’ is for. The class initialiser is a method named ‘__init__’, and
is called on each newly-created instance before that instance is
returned from the constructor.

I advise you to work through the Python tutorial, beginning to end,
which will give you a good grounding in these and other fundamental
Python topics <URL:http://docs.python.org/tutorial/>. Work through each
example, understand it by experimenting, and then proceed to the next,
until you've done the lot.

-- 
 \         “If history and science have taught us anything, it is that |
  `\     passion and desire are not the same as truth.” —E. O. Wilson, |
_o__)                                              _Consilience_, 1998 |
Ben Finney



More information about the Python-list mailing list