Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #21122

Re: Is this the proper way to use a class method?

References <4136337.363.1330668021961.JavaMail.geo-discussion-forums@ynjd19>
Date 2012-03-01 22:25 -0800
Subject Re: Is this the proper way to use a class method?
From Chris Rebert <clp2@rebertia.com>
Newsgroups comp.lang.python
Message-ID <mailman.339.1330669514.3037.python-list@python.org> (permalink)

Show all headers | View raw


On Thu, Mar 1, 2012 at 10:00 PM, John Salerno <johnjsal@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

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

Is this the proper way to use a class method? John Salerno <johnjsal@gmail.com> - 2012-03-01 22:00 -0800
  Re: Is this the proper way to use a class method? Chris Rebert <clp2@rebertia.com> - 2012-03-01 22:25 -0800
    Re: Is this the proper way to use a class method? John Salerno <johnjsal@gmail.com> - 2012-03-01 23:16 -0800
      Re: Is this the proper way to use a class method? Ian Kelly <ian.g.kelly@gmail.com> - 2012-03-02 01:04 -0700
      Re: Is this the proper way to use a class method? Chris Rebert <clp2@rebertia.com> - 2012-03-02 00:08 -0800
        Re: Is this the proper way to use a class method? John Salerno <johnjsal@gmail.com> - 2012-03-02 10:51 -0800
        Re: Is this the proper way to use a class method? John Salerno <johnjsal@gmail.com> - 2012-03-02 10:51 -0800
    Re: Is this the proper way to use a class method? John Salerno <johnjsal@gmail.com> - 2012-03-01 23:16 -0800

csiph-web