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