[Edu-sig] poking around in Py3k (recycling old algebra)

kirby urner kirby.urner at gmail.com
Thu May 28 17:38:35 CEST 2009

On Thu, May 28, 2009 at 8:22 AM, kirby urner<kirby.urner at gmail.com> wrote:

<< SNIP >>

> I was reading about descriptors, again per Holden workshop, and
> noticing the author adding at class level, but never making use of the
> passed instance argument, only self (inside the descriptor).

Below is the example from the other book, for contrast.

Note how the "instance" variable is not used in __set__ or __get__, so
whereas it looks like you're getting a new attribute there at the end
(new_att), you're not getting anything new at instance level.  David's
exposition was clearer.


Let's create a data descriptor, and use it through an instance:

>>> class UpperString(object):
...     def __init__(self):
...         self._value = ''
...     def __get__(self, instance, klass):
...         return self._value
...     def __set__(self, instance, value):
...         self._value = value.upper()
>>> class MyClass(object):
...    attribute = UpperString()
>>> instance_of = MyClass()
>>> instance_of.attribute
>>> instance_of.attribute = 'my value'
>>> instance_of.attribute
>>> instance.__dict__ = {}

Now if we add a new attribute in the instance, it will be stored in
its __dict__ mapping:

>>> instance_of.new_att  = 1
>>> instance_of.__dict__
{'new_att': 1}

But if a new data descriptor is added in the class, it will take
precedence over the instance __dict__:

>>> MyClass.new_att = MyDescriptor()
>>> instance_of.__dict__
{'new_att': 1}
>>> instance_of.new_att
>>> instance_of.new_att = 'other value'
>>> instance_of.new_att
>>> instance_of.__dict__
{'new_att': 1}


Expert Python Programming: Learn best practices to designing, coding,
and distributing your Python software
Tarek Ziadé Copyright © 2008 Packt Publishing

More information about the Edu-sig mailing list