Type emulation issues with new style classes
Michael Hudson
mwh at python.net
Mon Mar 1 06:13:27 EST 2004
"Chris" <feb04.20.netman at spamgourmet.com> writes:
> I tried a couple variation of that, and __getattr__, when defined in a
> metaclass is never called when accessing an attribute on an instance of a
> class derived from that metaclass.
>
> Here is some testing I did:
>
> class Zmeta(type):
> def __getattribute__(*args):
> raise Exception('called __getattribute__ with %s' % str(args))
> def __getattr__(*args):
> raise Exception('called __getattr__ with %s' % str(args))
>
> Z = Zmeta('Z', (), {'value': 42})
> z = Z()
>
> >>> int(z)
> TypeError: int() argument must be a string or a number
> >>> z.__int__
> AttributeError: 'Z' object has no attribute '__int__'
> >>> Z.__int__
> Exception: called __getattribute__ with (<class '__main__.Z'>, '__int__')
>
> It appears (and is confirmed in: Metaclass Programming in Python Pt. 2
> http://www-106.ibm.com/developerworks/library/l-pymeta2/?ca=dnt-434) that
> metaclass attributes are available to instances (classes) but not instances
> of instances.
Argh. Yes, now I think about the implementation, this isn't that
surprising. OTOH, one shouldn't have to know Objects/typeobject.c as
well as I do to avoid being surprised by Python...
I've added some more detailed comments to the bug report Michele
mentioned, if you're curious.
Cheers,
mwh
--
SCSI is not magic. There are fundamental technical reasons why it
is necessary to sacrifice a young goat to your SCSI chain now and
then. -- John Woods
More information about the Python-list
mailing list