Re: [Tutor] class arguments?
Le Thu, 22 Jan 2009 23:29:59 -, Alan Gauld alan.ga...@btinternet.com a écrit : Alan Gauld alan.ga...@btinternet.com wrote is there a way to give arguments to a class definition? I see that Kent interpreted your question differently to me. If you do mean that you want to dynamically define class attributes rather than instance attributes then __init__() won't work. But I'd be interested to understand why and how you would want to do that? And in particular how you would use them after creating them? Thank you Alan and sorry for not having been clear enough. The point actually was class (definition) attributes. I thought at e.g. Guido's views that lists were for homogeneous sequences as opposed to tuples rather like records. And a way to ensure sich a homogeneity, in the sense of items beeing of the same type or super type. The straightforward path to ensure that, as I see it, is to add proper argument to a class definition. But I couldn't find a way to do this. In pseudo-code, it would look like that: class MonoList(list, item_type): typ = item_type def __init__(self,items): self._check_types(items) list.__init__(self,items) def _check_types(self,items): for item in items: if not isinstance(item,MonoList.typ): message = blah! raise TypeError(message) def __setitem__(self,index,item): if not isinstance(item,MonoList.typ): message = blah! raise TypeError(message) list.__setitem__(self,index,item) def __add__(self,other): self._check_types(other) list.__add__(self,other) ... Well, I realize now that it is a bit more complicated. MonoList itself should be an intermediate base class between list and and subclasses that each allow only a single item type. Otherwise all monolist-s have the same item type ;-) Just exploring around... denis ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor -- la vida e estranya ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] class arguments?
On Fri, Jan 23, 2009 at 6:04 AM, spir denis.s...@free.fr wrote: Thank you Alan and sorry for not having been clear enough. The point actually was class (definition) attributes. I thought at e.g. Guido's views that lists were for homogeneous sequences as opposed to tuples rather like records. And a way to ensure sich a homogeneity, in the sense of items beeing of the same type or super type. The straightforward path to ensure that, as I see it, is to add proper argument to a class definition. A simple way to do this is with a class factory function, for example: def makeMonoList(typ, number): class MonoListSubtype(MonoList): item_type = type item_number = number return MonoListSubtype then e.g. IntegerList = makeMonoList(int, 5) myIntegerList = IntegerList() This is similar in spirit to collections.namedtuple() in Python 2.6 though the implementation is different; namedtuple() actually creates and evaluates the text of the new class definition: http://docs.python.org/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields http://svn.python.org/view/python/trunk/Lib/collections.py?rev=68853view=auto Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] class arguments?
Forwarding to the list with my reply... On Fri, Jan 23, 2009 at 1:35 PM, spir denis.s...@free.fr wrote: Le Fri, 23 Jan 2009 06:45:04 -0500, Kent Johnson ken...@tds.net a écrit : On Fri, Jan 23, 2009 at 6:04 AM, spir denis.s...@free.fr wrote: Thank you Alan and sorry for not having been clear enough. The point actually was class (definition) attributes. I thought at e.g. Guido's views that lists were for homogeneous sequences as opposed to tuples rather like records. And a way to ensure sich a homogeneity, in the sense of items beeing of the same type or super type. The straightforward path to ensure that, as I see it, is to add proper argument to a class definition. A simple way to do this is with a class factory function, for example: def makeMonoList(typ, number): class MonoListSubtype(MonoList): item_type = type item_number = number return MonoListSubtype That's it! Stupid me!! [Just realize I have a kind of mental blocage that prevents me *imagining* a class beeing defined inside a func. As for me a class is a higher level kind of thing. Actually I also have problems with defs insides defs. Maybe there should be more introduction to that in python literature. Probably it may help and simplify a whole lot of models.] Thank you again. then e.g. IntegerList = makeMonoList(int, 5) myIntegerList = IntegerList() This is similar in spirit to collections.namedtuple() in Python 2.6 though the implementation is different; namedtuple() actually creates and evaluates the text of the new class definition: http://docs.python.org/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields http://svn.python.org/view/python/trunk/Lib/collections.py?rev=68853view=auto I have watched that some time ago -- as you pointed to it already. I take the opportunity to ask why this contruct is so complicated. There is an alternative in the cookbook (also pointed by Kent, if I remmember well) that is only a few lines long. Something like: class Record(dict): def __init__(self,**kwargs): dict.__init__(self,kwargs) # and/or self.__dict__ = kwargs [There are several versons around, +/- based on the same principle] namedtuple() creates a new class that has exactly the desired attributes, so it is a bit more specific and typesafe - you have to have the correct number of points. The generated class subclasses tuple so it can be used as a dict key (if the items themselves can be). Class instances are lightweight because they don't have a __dict__ member. Actually, the thing I like at least in the namedtuple recipe is that it writes the class def as a string to be executed: Yeah, I know...with all the time we spend on the list telling people not to use eval()... snip code I know there are several advantages: * a docstring * For large collections of records of the same (sub)type, as the list of field is held by the class (instances record the actual data only), which spares memory. But doesn't this lead to lower performance, as attribute access by name requires adressing a class level attribute? The attributes are properties, so attribute access is like a method call, I suppose this is slower than direct field access but it is a common Python technique. * attributes can be accessed by index, too Also, as this factory create kinds of records, meaning data constructs with an identical structure, that would perfectly hold table records, why isn't it simply called record. To sum up in a word: why so much *complication*? I guess you would have to search comp.lang.python or python-dev to find the reasons, I don't think there is a PEP for this (at least not referenced in the What's New). Kent Denis -- la vida e estranya ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] class arguments?
spir denis.s...@free.fr wrote is there a way to give arguments to a class definition? Eg class MonoList(list, typ, number): item_type = typ item_number = number Yes thats what the __init__ method is for. class MonoList: def __init__(self, lst, typ, num): self.item_type = typ self.number = num etc... myList = MonoList([1,2,3], int, 3)# or whatever... HTH, -- Alan Gauld Author of the Learn to Program web site http://www.freenetpages.co.uk/hp/alan.gauld ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] class arguments?
On Thu, Jan 22, 2009 at 5:18 PM, Kent Johnson ken...@tds.net wrote: On Thu, Jan 22, 2009 at 4:51 PM, spir denis.s...@free.fr wrote: Hello, is there a way to give arguments to a class definition? Eg class MonoList(list, typ, number): item_type = typ item_number = number Use the type() function (which is the constructor for the type 'type') to dynamically create classes (i.e. types), e.g. In [1]: typ = int In [2]: number = 3 In [3]: MonoList = type(MonoList, (list,), dict(item_type=typ, item_number=number)) In [4]: ml = MonoList() In [5]: ml.item_type Out[5]: type 'int' In [6]: ml.item_number Out[6]: 3 In [7]: isinstance(ml, list) Out[7]: True And to show that these are class attributes: In [4]: MonoList.item_number Out[4]: 3 In [5]: MonoList.item_type Out[5]: type 'int' Kent ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor
Re: [Tutor] class arguments?
Alan Gauld alan.ga...@btinternet.com wrote is there a way to give arguments to a class definition? I see that Kent interpreted your question differently to me. If you do mean that you want to dynamically define class attributes rather than instance attributes then __init__() won't work. But I'd be interested to understand why and how you would want to do that? And in particular how you would use them after creating them? Yes thats what the __init__ method is for. class MonoList: def __init__(self, lst, typ, num): self.item_type = typ self.number = num etc... myList = MonoList([1,2,3], int, 3)# or whatever... Alan G. ___ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor