On Jun 25, 8:10 am, Michael Sliczniak <msliczn...@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 -- http://mail.python.org/mailman/listinfo/python-list