By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
446,369 Members | 1,188 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 446,369 IT Pros & Developers. It's quick & easy.

Multiple inheritance and __slots__

P: n/a
Hi all,
>From the google search, it seems its not possible to do the following.
>>class Test1(object):
.... __slots__ = ['a']
....
>>class Test2(object):
.... __slots__ = ['b']
....
>>class Test3(Test1,Test2):
.... __slots__ = ['c']
....
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict

I just want to make sure that I am using only the attributes a,b and c
from the instances of Test3 . Is there any other hack that could be
done.

--
Suresh

Dec 14 '06 #1
Share this Question
Share on Google+
5 Replies


P: n/a
On 14 Dec 2006 05:23:33 -0800, jm*******@no.spam.gmail.com
<jm*******@gmail.comwrote:
Hi all,
From the google search, it seems its not possible to do the following.
>class Test1(object):
... __slots__ = ['a']
...
>class Test2(object):
... __slots__ = ['b']
...
>class Test3(Test1,Test2):
... __slots__ = ['c']
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict

I just want to make sure that I am using only the attributes a,b and c
from the instances of Test3 . Is there any other hack that could be
done.
Difficulty with subclassing is the price you pay for abusing slots.
Slots are intended as a performance tweak only, to minimise the memory
footprint of classes of which you are going to have a great number of
instances.

In short - don't do that.

--
Cheers,
Simon B
si***@brunningonline.net
http://www.brunningonline.net/simon/blog/
Dec 14 '06 #2

P: n/a

Simon Brunning wrote:
On 14 Dec 2006 05:23:33 -0800, jm*******@no.spam.gmail.com
<jm*******@gmail.comwrote:
Hi all,
>From the google search, it seems its not possible to do the following.
>>class Test1(object):
... __slots__ = ['a']
...
>>class Test2(object):
... __slots__ = ['b']
...
>>class Test3(Test1,Test2):
... __slots__ = ['c']
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict

I just want to make sure that I am using only the attributes a,b and c
from the instances of Test3 . Is there any other hack that could be
done.

Difficulty with subclassing is the price you pay for abusing slots.
Slots are intended as a performance tweak only, to minimise the memory
footprint of classes of which you are going to have a great number of
instances.

In short - don't do that.
OK. But is there any other way to do what __slots__ does as a 'side
effect' i.e. forcing me to think about the list of attributes my class
is going to have upfront and raising error whenever I violate it. IMHO
this is a very good thing to have even if one does not care about
memory.

--
Suresh
>
--
Cheers,
Simon B
si***@brunningonline.net
http://www.brunningonline.net/simon/blog/
Dec 14 '06 #3

P: n/a
jm*******@no.spam.gmail.com wrote:
OK. But is there any other way to do what __slots__ does as a 'side
effect' i.e. forcing me to think about the list of attributes my class
is going to have upfront and raising error whenever I violate it. IMHO
this is a very good thing to have even if one does not care about
memory.
See http://aspn.activestate.com/ASPN/Coo.../Recipe/252158 (how
to freeze Python classes)

Michele Simionato

Dec 14 '06 #4

P: n/a
Simon Brunning wrote:
Difficulty with subclassing is the price you pay for abusing slots.
Although you could have the same difficulty even
if you weren't abusing them.

It's just a limitation of the implementation.
The use of __slots__ forces a particular layout
im memory, and you can only do that for one
base class at a time.

--
Greg
Dec 14 '06 #5

P: n/a
jm*******@no.spam.gmail.com wrote:
Simon Brunning wrote:
>On 14 Dec 2006 05:23:33 -0800, jm*******@no.spam.gmail.com
<jm*******@gmail.comwrote:
>>Hi all,
From the google search, it seems its not possible to do the following.

>class Test1(object):
... __slots__ = ['a']
...
>class Test2(object):
... __slots__ = ['b']
...
>class Test3(Test1,Test2):
... __slots__ = ['c']
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Error when calling the metaclass bases
multiple bases have instance lay-out conflict

I just want to make sure that I am using only the attributes a,b and c
from the instances of Test3 . Is there any other hack that could be
done.
Difficulty with subclassing is the price you pay for abusing slots.
Slots are intended as a performance tweak only, to minimise the memory
footprint of classes of which you are going to have a great number of
instances.

In short - don't do that.
OK. But is there any other way to do what __slots__ does as a 'side
effect' i.e. forcing me to think about the list of attributes my class
is going to have upfront and raising error whenever I violate it. IMHO
this is a very good thing to have even if one does not care about
memory.

--
Suresh
>--
Cheers,
Simon B
si***@brunningonline.net
http://www.brunningonline.net/simon/blog/
Sounds a lot like you are coming from another programming language
and are trying to make Python act like it did. Hey I did the same
thing when I first took up Python as a language. Python is not Java
(or any other language that puts you in a straight jacket). IMHO if
you embrace the dynacism of Python and you will be much happier
writing code in it. Don't worry if someone will try to assign to
some attribute in your class that "is illegal". They may be doing
if for some reason you can't fathom at the outset.

-Larry
Dec 14 '06 #6

This discussion thread is closed

Replies have been disabled for this discussion.