Creating Classes

Dave Angel davea at ieee.org
Sat Dec 19 21:43:30 EST 2009


Steve Holden wrote:
> Dave Angel wrote:
>   
>> seafoid wrote:
>>     
>>> Hey Guys,
>>>
>>> I have started to read over classes as a brief respite from my parsing
>>> problem.
>>>
>>> When a class is defined, how does the class access the data upon which
>>> the
>>> class should act?
>>>
>>> Example:
>>>
>>> class Seq:                                                               
>>>     def __init__(self, data, alphabet = Alphabet.generic_alphabet):
>>>         self.data = data         self.alphabet = alphabet
>>>
>>>     def
>>> tostring(self):                                                  
>>>         return self.data                                                 
>>>     def tomutable(self):
>>>         return MutableSeq(self.data, self.alphabet)
>>>         def count(self, item):
>>>         return len([x for x in self.data if x == item])
>>>
>>> I know what it should do, but have no idea how to feed it the data.
>>>
>>> Methinks I need to invest in actual computing books as learning from
>>> biologists is hazy!
>>>
>>> Kind regards,
>>> Seafoid.
>>>             
>>>       
>> Steve's message was good, but I feel he kind of jumped in the middle.  A
>> class is a description of a type of object, and the behaviors and data
>> that each instance of the object supports.
>>
>> You create the object by using the class name like a function call.  The
>> arguments to that "call" are passed to the __init__ method.
>>
>> So  obj = Seq("abcd")    or   obj = Seq("defg", "abcdefg")    would each
>> create an object of the class.  But generally, many objects will exist,
>> each with different data.
>>
>> The data in the object is accessed in what appears to be the "self"
>> namespace.  The name self is just a convention, but it's the first
>> argument of each method of the class.  So when somebody calls the
>> count() method, they pass 'item' a value, but self is used to refer to
>> that particular object's data.
>>
>> So how does 'self' get assigned?  That's what Steve was describing. 
>> When you use the syntax:
>>     obj.count("value")
>>
>> you actually call the count method with self referring to "obj" and item
>> referring to "value".  obj does double-duty here, both defining which
>> class' count() method will be called, and also supplying the first
>> parameter to the call, the "self" parameter.
>>
>> There are more complex things that can go on, like creating "bound"
>> function objects, but  I think this should get you pretty far.
>>
>> One other point:  you should always derive a class from some other
>> class, or 'object' by default.  So you should being the class definition
>> by:
>>
>> class Seq(object):
>>
>> Why?  It mainly has to do with super().  But in any case if you omit the
>> 'object' it's an "old style" class, and that's not even supported in
>> 3.x, so it's better to just get in the habit before it matters.
>>
>>     
> With respect, unless you have to expound on the differences between the
> old-style and the new-style classes (which aren't relevant here) you are
> just introducing a red herring by even mentioning it. The average Python
> user won't need to use super() in their first year as a Python programmer.
>
> And, since you brought up Python 3, it's not necessary to explicitly
> inherit from object to get new-style classes because, as you correctly
> point out, old-style classes don't exist in Python 3.
>
> I have no idea why you think "you should always derive a class from some
> other class". That's pretty unnecessary.
>
> regards
>  Steve
>   
I'm not sure why, but since it changes behavior (more than just 
super()), and since the old behavior is deprecated, I think it's 
worthwhile to use new-style classes.  And although you don't need to 
explicitly  do it in Python 3.x, it does no harm.

DaveA





More information about the Python-list mailing list