On 12.01.2013 11:24, Alan Gauld wrote:
On 12/01/13 08:09, Jan Riechers wrote:

So to rephrase what you and also other wrote:
By setting "oakTree = Tree()" I create a new "Tree()" class instance.
Now calls to "oakTree.grow()" access functions of the Tree class, by
traversing to it's "Superclass" Tree.

No, they traverse to its Tree class. Superclasses are only involved when
you use inheritance. Consider:

class Tree:
    def __init__(self,height=0):
      self.height = height

    def getHeight(self):
       return self.height

def EverGreen(Tree):    # subclass of Tree
    def __init__(self, height=0, color='green'):
        Tree.__init__(self,height)
        self.color = color

    def getColor(self):
        return self.color


t = Tree()
print t.getHeight()     # calls Tree.getHeight

g = EverGreen()
print g.getHeight()    # calls Tree.getHeight by searching superclass
print g.getColor()     # calls EverGreen.getColor

So the superclass is only used in the case of g.getHeight()
Python looks for getHeight in the class of EverGreen and can't find it.
So it looks in the superclass Tree to see if it can find getHeight there.


Actually I miss the terminology but that was what I thought to describe - also referring to your initial post on my question. If a class is based on a super class, the message lookup traversal goes from child to superclass, which now makes sense.


The "self" then, which also is used in the Superclass Function only
tells, work with the "own" (self) values of the class instance, instead
of the values of the class itself.

I guess that's right.

Maybe, I'm not sure what you mean. self is a reference to the instance
invoking the method.


Given:

class Market():
        def __init__(self):
                self.traders = 0

        def addTrader(self):
                self.traders += 1

instanceMarket = market()
print instanceMarket.traders # 0
instanceMarket.addTrader()
print instanceMarket.traders # 1

So the value of "traders" is unique to the instance, but the class function "addTrader", refers to the instance on which the function is invoked on (using self), but is declared only once for all instances based on "market". That also does now make sense. :)

Actually Im puzzled with the difference between a classmethod and a
regular function definition inside a class object.

All methods are functions defined inside classes. "regular functions"
are by definition NOT defined in a class. regular functions require no
lookup mechanism and do not have a "magic" first parameter like self.

Does the classmethod just mean that I can use the class "math" and call
"math.random()" without creating an instance of math before using
"random()" ?

Maybe, if math were a class. But math is actually a module which is
different to a class.


I think again the terms are mixing things up.
I tried that with the "classmethod" decorator and ended up with something like this:
class market():
        __balance = 500

        @classmethod
        def getBalance(cls):
                print cls.__balance


In this case now, from what was explained and what meant to say,
market.getBalance() can now called without creating an instance of that class (like a module, even so it is not.)

So calling:
market.getBalance() # --> 500

Okay, that makes sense - that class functions/methods (confusing with
that decorator to talk about)

The decorator is only used for classmethods not for instance methods.
Most of the time you don't need to use classmethods you only need
instance methods.

Sorry again for the long post and mixing up the wordings, I guess I have to practice and read a bit more, but I understand now more of the OOP concept and inner workings than before - so it helped already :)

Jan


_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to