[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 >>>
まあそうだよね、って感じ