extending method descriptors
Carl Banks
pavlovevidence at gmail.com
Thu Jun 25 15:30:30 EDT 2009
On Jun 25, 8:10 am, Michael Sliczniak <msliczn... at gmail.com> wrote:
> Suppose I have this:
>
> Python 2.5.1 (r251:54863, Feb 6 2009, 19:02:12)
> [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
> Type "help", "copyright", "credits" or "license" for more information.>>> class A(object):
>
> ... __slots__ = ('x', 'y')
> ...
>
> >>> a = A()
> >>> b = A()
>
> So I am using descriptors (and I want to). I also would like to have
> methods A.x.foo(), A.x.bar(), A.y.foo(), and A.y.bar() and my idea was
> to extend member_descriptor, but it seems that I cannot:
>
> >>> type(A.x)
>
> <type 'member_descriptor'>>>> class my_descriptor(type(A.x)):
>
> ... def foo():
> ... return 1
> ...
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> TypeError: Error when calling the metaclass bases
> type 'member_descriptor' is not an acceptable base type
The question isn't too clear, but I can explain this error message.
A Python type defined in C must have Py_TP_BASETYPE set in its
tp_flags field, otherwise subclassing it isn't happening.
If you want such functionality, I believe it would be easiest have to
implement a MemberDescriptorWrapper class in Python that delegates to
the actual member_descriptor. You would use it something like this:
class A(object):
__slots__ = ['_x_internal','_y_internal']
x = MemberDescriptorWrapper('_x_internal')
y = MemberDescriptorWrapper('_y_internal')
MemberDescriptorWrapper class would have to implement __get__,
__set__, and __del__ methods and have them call the corresponding
methods on the slot; details are left as an exercise.
Carl Banks
More information about the Python-list
mailing list