coloring a complex number
Bengt Richter
bokr at oz.net
Fri Oct 21 22:44:20 EDT 2005
On Fri, 21 Oct 2005 20:55:47 -0500, Brandon K <prince_amir86 at yahoo.com> wrote:
>I'm not 100% sure about this, but from what it seems like, the reason
>method B worked, and not method a is because class foo(complex) is
>subclassing a metaclass. So if you do this, you can't init a meta class
>(try type(complex), it equals 'type' not 'complex'. type(complex())
>yields 'complex'), so you use the new operator to generator a class on
>the fly which is why it works in method B. I hope that's right.
>
>-Brandon
>> Spending the morning avoiding responsibilities, and seeing what it would
>> take to color some complex numbers.
>>
>> class color_complex(complex):
>> def __init__(self,*args,**kws):
>> complex.__init__(*args)
>> self.color=kws.get('color', 'BLUE')
>>
>>>>> a=color_complex(1,7)
>>>>> print a
>> (1+7j) #good so far
>>>>> a=color_complex(1,7,color='BLUE')
>> Traceback (most recent call last):
>> File "<pyshell#37>", line 1, in -toplevel-
>> a=color_complex(1,7,color='BLUE')
>> TypeError: 'color' is an invalid keyword argument for this function
>>
>> No good... it seems that I am actually subclassing the built_in function
No, complex is callable, but it's a type:
>>> complex
<type 'complex'>
>> 'complex' when I am hoping to have been subclassing the built_in numeric
>> type - complex.
>>
You need to override __new__ for immutable types, since the args that build
the base object are already used by the time __init__ is called, and UIAM the
default __init__ inherited from object is a noop. However, if you define __init__
you can choose to process the other args in either place, e.g.:
>>> class color_complex(complex):
... def __new__(cls, *args, **kws):
... return complex.__new__(cls, *args)
... def __init__(self, *args, **kws):
... self.color=kws.get('color', 'BLUE')
...
>>> a=color_complex(1,7)
>>> a
(1+7j)
>>> a=color_complex(1,7, color='BLUE')
>>> a
(1+7j)
>>> a.color
'BLUE'
Or as in what you found, below:
>> but some googling sends me to lib/test/test_descr.py
>>
>> where there a working subclass of complex more in
>> accordance with my intentions.
>>
>> class color_complex(complex):
>> def __new__(cls,*args,**kws):
>> result = complex.__new__(cls, *args)
>> result.color = kws.get('color', 'BLUE')
>> return result
>>
>>>>> a=color_complex(1,7,color='BLUE')
>>>>> print a
>> (1+7j)
>>>>> print a.color
>> BLUE
>>
>> which is very good.
>>> a=color_complex(1,7, color='RED')
>>> a
(1+7j)
>>> a.color
'RED'
(just to convince yourself that the default is just a default ;-)
>>
>> But on the chance that I end up pursuing this road, it would be good if
>> I understood what I just did. It would certainly help with my
>> documentation ;)
>>
>> Assistance appreciated.
>>
>> NOTE:
>>
>> The importance of the asset of the depth and breadth of Python archives
>> - for learning (and teaching) and real world production - should not be
>> underestimated, IMO. I could be confident if there was an answer to
>> getting the functionality I was looking for as above, it would be found
>> easily enough by a google search. It is only with the major
>> technologies that one can hope to pose a question of almost any kind to
>> google and get the kind of relevant hits one gets when doing a Python
>> related search. Python is certainly a major technology, in that
>> respect. As these archives serve as an extension to the documentation,
>> the body of Python documentation is beyond any normal expectation.
>>
>> True, this asset is generally better for answers than explanations.
>>
>> I got the answer I needed. Pursuing here some explanation of that answer.
>>
HTH
Regards,
Bengt Richter
More information about the Python-list
mailing list