On Thu, Mar 1, 2012 at 10:00 PM, John Salerno <johnj...@gmail.com> wrote: > This is purely for fun and learning, so I know there are probably better ways > of creating a chess program. Right now I'm just curious about my specific > question, but I'd love to hear any other advice as well. > > Basically, I'm wondering if I'm using the class method properly with the move > method.
Unfortunately, no. > The reason I did it this way is because every chess piece will obviously have > its own move method, yet they will all need to mark the piece as moved, so I > figure that's best written once in the superclass. Right, but why not just a regular instance method? The method in question doesn't operate upon *the class itself* at all (which is the raison d'etre of classmethods); it instead operates upon an instance. A staticmethod would be slightly less weird, but really, it should just be an instance method. > This works, but doing it this way seems weird, since the point of a class > method is that it can be called by the class itself, even before instances > have been created. Yet the way I've implemented it, it is necessarily tied to > being called on an instance. Is this wrong? Is there a better way to do what > I'm doing with move? Just make it a normal instance method (i.e. remove the `cls` argument). > Also, do I need the @classmethod decorator? The book I'm reading says to use > it (and @staticmethod), but the following code works without it. That's just a coincidence. Your supercall is ought to be: super().move() In contrast, super().move(self) calls the superclass instance method `move` with 2 arguments, both `self`, which just happens to work given your move() method, inside which `cls` isn't actually a class like it ought to be. <snip> > class ChessPiece: > > def __init__(self, position, label, has_moved): > try: > self.position = (position[0], int(position[1])) > except TypeError: > self.position = position > self.label = label > self.has_moved = has_moved > > def move(cls, self): > self.has_moved = True > > > class Pawn(ChessPiece): > > def __init__(self, position=None, label=1, has_moved=False): > super().__init__(position, label, has_moved) > > def move(self): > super().move(self) > self.position = (chr(ord(self.position[0]) + 1), self.position[1] + 1) Cheers, Chris -- http://mail.python.org/mailman/listinfo/python-list