Why property works only for objects?
Alex Martelli
aleaxit at yahoo.com
Sun Mar 12 11:38:29 EST 2006
Michal Kwiatkowski <ruby at no.spam> wrote:
...
> > No, the value found in the instance (your second 'else' here) takes
> > precedence if the descriptor found in the first 'else' is
> > non-overriding.
>
> Oh, right. My mistake comes from the subtle difference between defining
> descriptor as a class and by property() builtin (I've tested only second
> option and assumed that descriptor without __set__ cannot be rebinded):
property is always overriding, of course, since type property does have
a property.__set__ (which raises an exception if you build the instance
of property w/o a setter function).
> class non_overriding(object):
> def __get__(*a):
> return 12
>
> class C(object):
> x = non_overriding()
> y = property(lambda s:23)
>
> c = C()
>
> c.x = 4
> print c.x # => 4
>
> c.y = 5 # => AttributeError: can't set attribute
Right: another example of overriding and nonoverriding descriptors.
> IMHO that's not very consistent.
How so? Given the lower-level semantics of descriptors (and the
distinction between overriding and non), are you suggesting that
property should not be a type but a factory function able to return
instances of either overriding or non-overriding types? I'm not sure how
that complication would make things "consistent" in your view.
> Well, probably some code rely on this,
> so I just have to live with it.
Backwards-incompatible changes can be proposed for Python 3.0, if they
lead to a situation that's preferable to what we have now. I just don't
see what you mean about "not very consistent" and what you would prefer
the language and built-ins to be.
Alex
More information about the Python-list
mailing list