object indexing and item assignment

John Posner jjposner at optimum.net
Fri Nov 13 19:21:30 CET 2009


King wrote:

> class MyFloat(object):
>     def __init__(self, value=0.):
>         self.value = value
>
>     def set(self, value):
>         self.value = value
>
>     def get(self):
>         return self.value
>
> class MyColor(object):
>     def __init__(self, value=(0,0,0)):
>         self.value = (MyFloat(value[0]),
>                         MyFloat(value[1]),
>                         MyFloat(value[2]))
>
>     def set(self, value):
>         self.value[0].set(value[0])
>         self.value[1].set(value[1])
>         self.value[2].set(value[2])
>
>     def get(self):
>         return (self.value[0].get(),
>                 self.value[1].get(),
>                 self.value[2].get())
>
> col = MyColor()
> col[0].set(0.5) # 'MyColor' object does not support indexing
> col[0] = 0.5 # 'MyColor' object does not support item assignment
>   

King, I think you might be trying too hard. (Since I don't know your 
"big picture", my suspicion might be wrong.) Python does not *require* 
you to implement "get" and "set" methods in user-defined classes. More 
detail ...

* You might not need the MyFloat class at all. Try using a plain old 
Python "float" value.

* You don't need the "set" and "get" methods in the MyColor class. So 
this might suffice:

    class MyColor(object):
        def __init__(self, value=(0.,0.,0.)):
            self.value = list(value)

It's important for self.value to be a *list* object only if you want 
modify individual components of a MyColor instance.  If you *do* want to 
modify individual components, then it *does* make sense to implement 
"set" and "get" methods:

        def set_comp(self, index, comp_value):
            self.value[index] = comp_value

        def get_comp(self, index):
            return self.value[index]

For debugging, it makes senses to implement a __str__ or __repr__ 
method, so that "print" produces useful output:

        def __str__(self):
            return "MyColor: %3.1f %3.1f %3.1f" % tuple(self.value)

Putting it all together ...

#-----------------
class MyColor(object):
    def __init__(self, value=(0.,0.,0.)):
        self.value = list(value)

    def __str__(self):
        return "MyColor: %3.1f %3.1f %3.1f" % tuple(self.value)

    def set_comp(self, index, comp_value):
        self.value[index] = comp_value

    def get_comp(self, index):
        return self.value[index]

col = MyColor()
print col              # output: MyColor: 0.0 0.0 0.0

col.set_comp(0, 0.5)
print col              # MyColor: 0.5 0.0 0.0

col.set_comp(2, 0.7)
print col              # MyColor: 0.5 0.0 0.7

col = MyColor((0.2, 0.3, 0.4))
print col              # MyColor: 0.2 0.3 0.4
#-----------------

-John




More information about the Python-list mailing list