> I do use staticmethod, and I've got some good examples at
> http://ece.arizona.edu/~edatools/Python/Animals.py, but never saw a real need
> for classmethod. Your example at least makes the utility plausible, although
> I could easily do the same without a classmethod. But I think I see what you
> are trying to do. Maybe you could expand the example a bit to make it more
> compelling. In the current example, the variable klass has only one value,
> Register. You could have multiple classes (Retail, Wholesale, etc.) to drive
> home that klass really is an important variable, and can't just be hard-coded
> as Register.
>
Hi Dave --
Good questions!
I think the staticmethod vs. classmethod topic, decorators aside,
is a good one, I hope we do more on it.
Here's your Animals.py with classmethod in place of staticmethod.
Works about the same. But I won't say "this answers your question"
-- just adds more grist to the mill at this point.
class Animal(object):
"Ancestor of the Animal hierarchy"
_numAnimals = 0
home = "Earth"
def __init__(self):
Animal._numAnimals += 1
@classmethod
def show(klass):
print "Inventory:"
print " Animals:", klass._numAnimals
class Reptile(Animal): pass
class Mammal(Animal):
_numMammals = 0
basal_metabolic_rate = 7.2
def __init__( self, s = "Maa... Maa..."):
Animal.__init__(self)
Mammal._numMammals += 1
self.sound = s
@classmethod
def show(klass):
Animal.show()
print " Mammals:", klass._numMammals,
print " BMR =", klass.basal_metabolic_rate
def talk(self):
print "Mammal sound: ", self.sound
class Bovine(Mammal): pass
class Canine(Mammal): pass
class Feline(Mammal):
_numFelines = 0
genus = "feline"
def __init__( self):
Mammal.__init__(self)
Feline._numFelines += 1
@classmethod
def show(klass):
Mammal.show()
print " Felines:", klass._numFelines
class Cat(Feline):
_numCats = 0
def __init__( self, n = "unknown", s = "Meow" ):
Feline.__init__(self)
Cat._numCats += 1
self.name = n
self.sound = s
@ classmethod
def show(klass):
Feline.show()
print " Cats:", klass._numCats
def talk(self):
print "My name is ...", self.name
print "I am a %s from %s" % (self.genus, self.home)
Mammal.talk(self)
def test():
a = Animal()
m = Mammal(); print "m:",; m.talk()
f = Feline(); print "f:",; f.talk()
c = Cat(); print "c:",; c.talk()
print "--- Cat.show() ---"
Cat.show()
print "--- cat1.talk() ---"
cat1 = Cat("Garfield", "Purr")
cat1.talk()
if __name__ == '__main__':
test()
Kirby
_______________________________________________
Edu-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/edu-sig