[Python-Dev] Python 3, new-style classes and __class__

Michael Foord fuzzyman at voidspace.org.uk
Sat Nov 19 23:25:14 CET 2011

On 19/11/2011 22:06, Vinay Sajip wrote:
> I was looking through the errors which occur when running the test suite of
> Django's py3k branch under Python 3, and one particular set of errors caught my
> eye which is unrelated to the bytes/str dance. These errors occur in some Django
> utility code, which supplies a SimpleLazyObject (new-style) class [1]. This
> implements a proxy, which is initialised using a callable. The callable returns
> the object to be wrapped, and it's called when needed to set up the wrapped
> instance.
> The SimpleLazyObject needs to pretend to be the class of the wrapped object,
> e.g. for equality tests. This pretending is done by declaring __class__ as a
> property in SimpleLazyObject which fetches and returns the __class__ attribute
> of the wrapped object. This approach doesn't work in Python 3, however: the
> property named __class__ doesn't show up in the class dict of SimpleLazyObject,
> and moreover, there are restrictions on what you can set __class__ to - e.g.
> Python complains if you try and set a __class__ attribute on the instance to
> anything other than a new-style class.
> What's the simplest way in Python 3 of implementing the equivalent approach to
> pretending to be a different class? Any pointers appreciated.
That works fine in Python 3 (mock.Mock does it):

 >>> class Foo(object):
...  @property
...  def __class__(self):
...   return int
 >>> a = Foo()
 >>> isinstance(a, int)
 >>> a.__class__
<class 'int'>

There must be something else going on here.

All the best,

Michael Foord

> Thanks and regards,
> Vinay Sajip
> [1] http://goo.gl/1Jlbj
> _______________________________________________
> Python-Dev mailing list
> Python-Dev at python.org
> http://mail.python.org/mailman/listinfo/python-dev
> Unsubscribe: http://mail.python.org/mailman/options/python-dev/fuzzyman%40voidspace.org.uk


May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html

More information about the Python-Dev mailing list