Neal Becker wrote: > 7stud wrote: > >> On Feb 21, 11:19 am, Neal Becker <[EMAIL PROTECTED]> wrote: >>> I'm working on a simple extension. Following the classic 'noddy' >>> example. >>> >>> In [15]: cmplx_int32 >>> Out[15]: <type 'numpy.cmplx_int32'> >>> >>> Now I want to add an attribute to this type. More precisely, I want a >>> class attribute. >>> >>> cmplx_int32.test = 0 >>> --------------------------------------------------------------------------- >>> TypeError Traceback (most recent call >>> last) >>> >>> /home/nbecker/numpy/<ipython console> in <module>() >>> >>> TypeError: can't set attributes of built-in/extension >>> type 'numpy.cmplx_int32' >>> >>> What am I missing? >> >> class Dog(object): >> def __setattr__(self, attr, val): >> print "TypeError: can't set attributes of built-in/extension" >> print "type 'Dog.cmplx_int32'" >> >> d = Dog() >> d.test = 0 >> >> --output:-- >> TypeError: can't set attributes of built-in/extension >> type 'Dog.cmplx_int32' > > Not quite, I'm setting a class attribute, not an attribute on an instance. > Quite. The problem is that extension types' attributes are determined by the layout of the object's slots and forever fixed in the C code that implements them: the slots can't be extended, so there's no way to add attributes. This is an efficiency feature: it would be *extremely* slow to look up the basic types' attributes using late-binding (it would also change the nature of the language somewhat, making it more like Ruby or Self).
So the reason you can't do what you want to is the same reason why you can't add attribute to the built-in types (which are, of course, clearly mentioned in the error message). >>> object.anyoldname = "You lose!" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: can't set attributes of built-in/extension type 'object' >>> If you look in typeobject.c you'll find this error message occurs when the object's type isn't a PyHeapTypeObject (in other words, if it's one of the built-in or extension types). regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC http://www.holdenweb.com/ -- http://mail.python.org/mailman/listinfo/python-list