DRYな備忘録

Don't Repeat Yourself.

【memo】Pythonの@classmethod

[22:48:38] % python
Python 3.3.2 (default, Jul 19 2013, 08:43:31)
[GCC 4.4.5] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class Base:
...     def func_a(self):
...             print('This is func A')
...
>>> class Foo(Base):
...     @classmethod
...     def call_func_a(self):
...             self.func_a()
...
>>> Foo.call_func_a()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in call_func_a
TypeError: func_a() missing 1 required positional argument: 'self'
>>>

んー。Baseに宣言したfunc_aの引数には何が来てるんやろか

>>>
>>> class Base:
...     def func_b(name):
...             print(name)
...
>>> class Bar(Base):
...     @classmethod
...     def call_func_b(self):
...             self.func_b('tainakaritsu')
...
>>> Bar.call_func_b()
tainakaritsu
>>>

んー。classmethodの中で静的に使った規定クラスのメソッドの第一引数はselfじゃない。

>>> class Base:
...     attr = 100
...     def func_c(name):
...             print("Name\t",name)
...             print("Attr\t",self.attr)
...
>>> Base.func_c()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func_c() missing 1 required positional argument: 'name'
>>> Base.func_c('Tainaka')
Name     Tainaka
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in func_c
NameError: global name 'self' is not defined
>>>

self渡してないからアタリマエ。でもnameにはTainakaが来てる。

>>> class Base:
...     attr = 100
...     def func_c(self,name):
...             print("Name\t",name)
...             print("Attr\t",self.attr)
...
>>> Base.func_c('Tainaka')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: func_c() missing 1 required positional argument: 'name'
>>>

@classmethodは徹底的にselfとは無関係に振る舞う。引数にselfを取らない。多分静的にBaseを渡せば行ける気がする。

>>> class Base:
...     attr = 100
...     def func_c(self,name):
...             print("Name\t",name)
...             print("Attr\t",self.attr)
...
>>> Base.func_c(Base, 'Tainaka')
Name     Tainaka
Attr     100
>>>

まあそうだよね、って感じ