いつもお世話になっております。
早速本題に入らせていただきます。
現在、PythonとDjangoを使用してWebアプリケーションを制作しているのですが、
クラスメソッドとインスタンスメソッドの使い分け、役割について理解が追い付いておりません。
下記に現在のコードを単純化したものを記載します。
Python
1class TestCommon: 2 """ 共通クラス """ 3 def method1(self): 4 # self.request.POST などを使った処理 5 data = TestCommon.method2(data) 6 7 def method2(self, data): 8 # method1 から呼ばれる、dataを変換する処理 9 return data 10 11class MainView(TemplateView, TestCommon): 12 """ 共通クラスを継承した子クラス """ 13 def get(self, request, *args, **kwargs): 14 # 親クラスの処理を呼ぶ 15 MainView.method1()
疑問1:各メソッドの使い分けがわからない
参考サイトには下記のように書かれています。
【インスタンスメソッド】
→ このメソッドは、インスタンスに紐づき、「self」を第一引数にとります。
【スタティックメソッド】
→ このメソッドは毎回同じ結果を出力したいときに使います
【クラスメソッド】
→ インスタンスメソッドが各インスタンスに結びつくのに対して、classmethodはクラスに結びつきます。メソッドを呼び出した時に第一引数には、クラスが自動的に代入されます。
私のイメージ的には、 method2()
はスタティックメソッドになるのではと思っています。(変換処理だけだし・・・)
method1() はただなんとなく、インスタンスメソッドか、クラスメソッドになる気がしています。あくまでもselfを使いたい=インスタンスメソッド?という浅はかな考えによるものですが・・・・。
此方について認識があっているか(多分間違っているのでしょうけれども)教えて頂きたいです。
疑問2:インスタンス化のタイミングがわからない
Python はとりあえず クラス名.メソッド名() と記載してしまえば、メソッドが使えてしまうイメージがあります。
例えば MainView.method1()
や TestCommon.method1()
といった感じです。
いつ test = TestCommon()
のようにインスタンス化する必要があって、必要がない時はいつなのか全くといっていいほどイメージが付きません。
クラスメソッドを呼ぶときでしょうか、インスタンスメソッドを呼ぶときでしょうか?
それとももうとっくにインスタンス化されているから必要がないのでしょうか・・・?
長々と書いてしまいましたが、恐らく cls や self を持ったメソッドを作る利点がわかっていないのだと思います。
最近ではまわりまわってもう全部 スタティックメソッド でいいのではとすら思ってきてしまいました・・・。
・・・そんなわけはないと思うので、大変恐縮ではありますが
お時間ある方でメソッドに関する知識をお持ちの方いらっしゃいましたら
ご助力頂けますと幸いです・・・。
追記
色々Googleを漁り、家にあったPython入門の参考書のオブジェクト指向のページを端から端まで読んで
さらにこんなわかりにくい質問に回答して頂いたお二方の回答も読んだうえで、まだ理解できないぽんこつなので追記で質問させていただきます。
もし、インスタンスを参照せずにクラスだけ参照する場合は、@classmethod を
もし、インスタンスもクラスも参照しない場合は、@staticmethod を使い、
多分私が理解できていないのはこの クラスだけ参照する場合 ってどういうことなの・・・っていう根本的なところが分かっていないせいかなと思います。
下記に私のイメージを書いてみようと思います。
Python
1class TestCommon: 2 test = "てすと" 3 4 @classmethod 5 def method1(cls): 6 """ 予想:クラスメソッド (クラスのみの参照?) """ 7 # メンバ変数を参照=クラスだけ参照? 8 print(cls.test) 9 10 def method2(self): 11 """ 予想:インスタンスメソッド(クラスとインスタンス両方参照?) """ 12 # selfを使わずにクラス名.メンバ変数で呼び出し? 13 print(TestCommon.test) 14 # インスタンスを参照? 15 print(self.request.POST) 16 17 def method3(self): 18 """ 予想:インスタンスメソッド(クラス参照なし?) """ 19 print(self.request.POST) 20 21 @staticmethod 22 def method4(data): 23 """ 予想:スタティックメソッドにすると引数エラー? """ 24 # 引数取らない=受け取れない??? 25 return data 26
今の私の認識は上記のような感じになっているのですが、これは合っていますでしょうか・・・
お時間あるときで構いませんので、ご教示いただけますと幸いです・・・。
教えて頂いたこの↓サイトものすごく、ものすごくわかりやすいかもしれない・・・ぽんこつにもわかる・・・
classmethod と
staticmethod ってなに?
回答3件
あなたの回答
tips
プレビュー