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

Reply via email to