Message189896
In the Data Model section of the documentation regarding descriptors invokations (http://docs.python.org/2/reference/datamodel.html#invoking-descriptors), it is said:
Note that descriptors are only invoked for new style objects or classes (ones that subclass object() or type()).
However, it seems this restriction isn't enforced in practice:
Python 2.7.4 (default, May 16 2013, 13:28:03)
[GCC 4.2.1 Compatible Apple Clang 4.0 ((tags/Apple/clang-421.0.60))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class Desc(object):
... def __get__(self, obj, cls):
... return 'test'
...
>>> class A: # Not inheriting object here
... desc = Desc()
...
>>> A().desc
'test'
I dived into CPython's code and saw no trace of a test for new-style classes in the descriptor invokation code path (down in classobject.c / instance_getattr2).
Unfortunately, fixing this behavior doesn't seem trivial as class methods appear to be implemented as descriptor themselves. In other words, and from my understanding, restricting descriptor invokation to new-style objects and classes would prevent method calls on old-style classes. |
|
Date |
User |
Action |
Args |
2013-05-24 05:39:43 | icecrime | set | recipients:
+ icecrime |
2013-05-24 05:39:43 | icecrime | set | messageid: <1369373983.58.0.00587959802813.issue18047@psf.upfronthosting.co.za> |
2013-05-24 05:39:43 | icecrime | link | issue18047 messages |
2013-05-24 05:39:42 | icecrime | create | |
|