読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

@classmethod

Pythonの@classmethod等はデコレータと言うらしい。

def beforehello(f):
  print "Hello"
  return f

class Foo():
  @beforehello
  def foo(self):
    return 1

Foo().foo()
# "Hello"
# 1

beforehelloにdef foo…の関数が渡されて、その戻り値が実際のメソッドとして登録される仕組み。
beforehelloもclassmethodも、実体はただの関数。それを、デコレータという仕組みを使って構文っぽくしているだけ、ということのようだ。

>>> classmethod
<type 'classmethod'>
>>> 

デコレータは、JavaScriptだと

function beforehello(f) {
  alert("Hello");
  return f;
}

function Foo() {}
Foo.foo = beforehello(function () {
  return 1;
});

new Foo().foo();

のように書ける。
で、@classmethodを見る。

class Foo():
  @classmethod
  def add1(cls, n):
    return n + 1

Foo.add1(2) # 3

クラスメソッドを作るデコレータ。何故こうできるのかと言うと、
PythonではFoo.bar(self, 1)と、Foo().bar(1)が同じだからだ。
つまり、@classmethodとして登録しても、Foo().add1(2)とも呼べる。
JavaScriptRubyと違う挙動だが、JavaPHPPythonC++は、クラスメソッドとして作った物もインスタンスから呼べるらしい。