Dynamic objects

Larry Bates larry.bates at websafe.com
Thu Aug 17 15:51:10 EDT 2006


Mark Shewfelt wrote:
> Hello,
> 
> I have implemented a series of classes representing a Building, its
> respective Equipment, and then various Components of that equipment
> like so (as you'll be able to tell, I'm a newbie):
> 
> class Building:
>      equipment = {}
>      def AddEquipment( name, data ):
>           equipment[ name ] = Equipment( data )
> 
> class Equipment:
>      components = {}
>      def AddComponent( name, data ):
>            components[ name ] = Component( data )
> 
> class Component:
>      data = ""
> 
> These classes are used like so:
> 
> test = Building()
> test.AddEquipment( "equipment 1", data )
> test.AddEquipment( "equipment 2", data )
> test.equipment["equipment 1"].AddComponent( "component 1", data )
> test.equipment["equipment 1"].AddComponent( "component 2", data )
> test.equipment["equipment 2"].AddComponent( "component 3", data )
> 
> But it appears as though the instance of "equipment 1" has ALL of the
> components in its components dictionary. I was hoping that the
> test.equipment["equipment 1"].components dictionary would only have
> those components that were assigned to "equipment 1".
> 
> I have implemented __init__  functions for all of the classes, but all
> they do is initialize some data that I haven't shown here.
> 
> I think I'm trying to use a C++ way of doing this (without the new
> operator) so if anyone would be so kind as to help with the Python way
> of doing this sort of thing I will be eternally grateful.
> 
> Cheers,
> 
> Mark Shewfelt
> 
With the way you defined Building multiple buildings would share
equipment dictionary as it is defined as a class variable and you
want an instance variable (I'm pretty sure).  You probably wanted
(not tested):

class Building:
    def __init__(self):
        self.equipment = {}

    def AddEquipment(name, data):
        equipment[name]=Equipment(data)

same for Equipment class and Component class.

class Equipment:
    def __init__(self):
        self.components={}

    def AddComponent(name, data):
        components[name]=Component(data)


class Component:
    def __init__(self, data)
        self.data=data


-Larry Bates



More information about the Python-list mailing list