クラスに関して勉強しはじめたのですが、とくに使いどころというかメリットがみつかりません
たとえばこんなの
lang
1class sample: 2 def __init__(self, s_1, s_2, s_3): 3 self.s_1 = s_1 4 self.s_2 = s_2 5 self.s_3 = s_3 6 7 def keisan(self): 8 return self.s_1 * self.s_2 * self.s_3 9 10 11ans = sample(2, 3, 4) 12print(ans.keisan())
なんとなく頭にあること
- 初期化メソッドのinitの引数にselfを指定して、上記のs_1, s_2のように書き、self.s_1 = s_1みたいにselfを使いアトリビュートに何かを指定することで、別の関数で使うときに使いまわし?ができる。
2.別の関数で初期化メソッドのアトリビュートを使うときはkeisan(self):みたいに引数にselfを指定しないと初期化メソッドのアトリビュートにアクセスできない。
3.つまりselfが肝である。
みたいなことでしょうか。そんな感じで全く分かってないまである。
あと、selfはオブジェクト自身を指す。とか書いてあったんですがオブジェクトなんでサンプルソースの中にいくらでもあんだろ。目みえてんのかお前
と言いたくなるくらいにselfが何なのか分かっていません。つまりselfは何なんでしょうか?
コーヒーも飲めない僕には理解できない概念なんでしょうか
教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
これは、クラスの文法を教えるためのサンプルです。
英語の勉強の、This is a pen. みたいなものですね。「これって、どんな場面で言うの?」という疑問は持って当然です。
プログラミング経験が無い人が、オブジェクト指向のメリットを本当の意味で「実感」するのは難しいと思います。また、小規模(ソースが数ページくらい)のプログラムだとあまりメリットは無いです(ないことはない)。
また、Pythonは、オブジェクト指向が後付けなので、
0. メソッド(上記のkeisan)の仮引数にselfを明示的に書かないといけない
0. インスタンス変数(上記のs_1等)のクラス外への隠蔽が出来ない
等というオブジェクト指向言語としてみると、弱点があり(オブジェクト指向言語らしくないというか)、そのためにわかりにくくなっている面はあります。
RubyやJavaなど、最初からのオブジェクト指向言語の方が、「オブジェクト指向」をより理解できるのではないかと思います(言語としてPythonが劣っているという意味では無く、あくまでオブジェクト指向の観点から)。
オブジェクト指向に興味がある場合は、RubyとJavaの入門書を一冊ずつ読んでみるのがいいかと思います。
もちろん「オブジェクト指向入門」のようなタイトルの付いた本でもいいです。
そうじゃなくて、Pythonの勉強をしたいのなら、「This is a pen.はどういうときに使うんだ?」という疑問はいったん心にしまって、先に進みましょう。
投稿2015/06/05 22:23
総合スコア85778
0
少し違う観点からオブジェクト指向言語のイメージを書いた記事を紹介します。
http://satoshi.blogs.com/life/2004/09/post.html
ざっくり要約すると、
関数型言語は英語のような言語で動詞が主体で、
オブジェクト指向言語は日本語のような名詞が主体ということ
「物」を先に考えることで、「動作」を限定して、
似たような物には似たような動作ができるようになるということです。
なので、selfはその「動作」に関わる「物」自身ってことですね
私はこの記事を読んでオブジェクト指向言語が好きになりました!
勘違い等有りましたらご指摘願います。
投稿2015/06/11 00:04
総合スコア65
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
お邪魔します。
たとえばpython固有の回答になりますが、pythonは関数型的なプログラミングも、オブジェクト指向プログラミングにも、手続き型の書き方もできてしまう言語です。
ちょっとしたテキスト処理をするスクリプトを書くときにわざわざクラス定義をすることはあまりないです。
少なくともpythonは3種類のパラダイムに対応することができる、ということです。
完全な関数型のエッセンスを成すには地獄を伴いますがwww、そうしてみるのもいい勉強ですね。
要するに、どれで書いてもよいのです。
ご質問の内容というのは要約すると、クラスが何故必要か、言い換えるとオブジェクト指向で何故作るのか、ということかなと思います。
どうしてオブジェクト指向という作り方が考え出されて、今でも世界的に使われているのか、過去の何を乗り越えるために考え出されたやり方なのか、それまでのやり方にはどういう問題があって、オブジェクト指向がどうやって解決し、クラスという機構がそのためにどう役立つのか、という理解がなければ、クラスが必要である理由もまたわからないのではないかと思います。
とても長い話なので、本当に興味がおありなら、この本をおすすめします。
(図書館なんかにもあると思います)
オブジェクト指向でなぜつくるのか
簡単に言うと、大きなソフトウェアを作るときに、色々な混乱を避けるためであり、より効率的にプログラムを作るためであり、...etcという感じです。
オブジェクト指向が持ち出された私の知る理由のうち、大きなものをいくつかあげると
①グローバル変数を無くし、すべての変数を何かのスコープに属させるため。
②処理を効率的に使いまわすため。
③同じ処理を何度も実装するのではなく、ひとつの処理はひとつのところに実装し、修正箇所を最小にするため。
こういったことを成すために、データが手続きを持つ、クラスという実装の単位が考案された、ということです。(間違ってたら指摘をお願いします。)
以上です。参考になりましたら幸いです。
投稿2015/06/06 09:32
総合スコア540
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Class といっても、
1.Static な Class
2.Dynamic な Class
があり、Class の有用性は、Dynamic な Class にあります。
極論で、Static な Class しか使わずに、プログラムを書く事も可能ですが、もったいないです。
Class の多態性は、同一ロジックで、似たようなコードを、繰返し書くような場合に、有用です。
他の方が、大規模だと有用と書かれていますが、Class は作り方により(良いか悪いかは別として)、
処理に必要な、全てを内包した Class を作成する事も可能です。
(.NET Frameworkや、各種フレームワークなどが、代表例です。)
’
簡単な思考実験
古くからある、VB等の
DIR関数では、
1回目:DIR(パス)、戻り値が空白であれば、それ以上データ無
2回目以後:DIR()、戻り値が空白になるまで、データが返って来る
この場合、最初に呼出したプログラムで、DIR()の戻り値が、
空白になって、関数の使用が終了するまでは、
他のコードが、DIR()関数を使う事は、問題を引き起こす事が
容易に想像できるはずです。
では、Dynamic な Class では、どうでしょう?
’
例えば、
関数の場合では、
複数の処理で、同一の関数を使用する場合に、
単体処理で終わるなら、不都合は余りありませんが、
初期化パラメータや、内部変数を保持するような場合には、
呼出対象毎に、それらを保持する仕組みを用意しなければなりません。
Dynamic な Class では、初期化して実体化しますから、
Class では、仕組みを作らなくても、Class 毎に独立した、
初期化パラメータや、内部変数を保持する事が可能です。
’
関数実行中に、再度自身が呼ばれうる事態は、
イベント駆動型システムでは、容易に発生します。
その時に、関数では、対処が面倒ですが、
Dynamic な Class では、変数等の独立性が担保されているので、
問題発生は、少なくなることが、見込まれます。
ポーリング型システム(グルグル回しのプログラム)でも、
イベント(割込み)は、有ったりしましたので、
過去から、コードと、変数の独立性の担保は、面倒な問題でした。
⇒面倒にならない様に、割込み側では、改変される可能性のあるもの全てを
スタックに保存し、処理終了後、スタックから復帰させる事が、当たり前でした。
投稿2015/06/06 00:44
総合スコア2030
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ruby, pythone ではたくさんの機能が class で提供されています。
-
Ruby 2.2.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ http://docs.ruby-lang.org/ja/2.2.0/library/_builtin.html
-
Python » Documentation » Python 標準ライブラリ http://docs.python.jp/2/library/stdtypes.html#string-methods
オブジェクト指向の言語では、 class は不可欠な要素となっています。
class の概念を理解せずに ruby, pyhon を使いこなすことはできません。
self については、次のページを読んでみてください。
- Python基礎講座 (13 クラス) http://qiita.com/Usek/items/a206b8e49c02f756d636
...
ポイントはメソッドの最初の引数selfです。他の言語からPythonに入った人は
「spam.ham()には引数が無いのに、このselfはなんなのだろう?」と思うかもしれません。
Pythonではメソッドは最低1つの引数を持ちます。この最初の引数は必ずselfという名前にする慣例があります。
...
投稿2015/06/05 23:22
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
selfがあることでクラスの変数なのか否かが明示できます。(クラス自身の変数だからself)
クラスのメンバ変数に(つまり、self.s_1など)に外部から引数として受け取った変数を
代入(self.s_1 = s_1など)することで、そのクラスの変数として使えるようになります。
こういう仕組みにすることで、クラスが他の関数を多数もつ場合、その受け取った変数を毎回書かなくても、self.s_1 = s_1と最初に書いておけば、self.s_1で代用できます。(関数に引数を書かなくても、self.s_1を引数の代わりに使える)
なお、self.listとして配列をセットすることも可能です。
このようにオブジェクト志向ではコードを使いまわせるように(何回も同じことを書かなくて済むように)工夫がなされています。これはruby on railsなども同じ設計思想です。
クラスからクラスへアクセスするときに、アクセスするクラスさえ変えてやれば(インターフェースから実装して同じ関数名であれば)、別の処理をするコードに瞬時に書き換えたりできたりします。(手続き型言語だと、仕様を変更しようとすると、それに関わる関数、変数などすべて書き換える必要があり、とても手間がかかる場合があります。)
このように、部品みたいにクラスは取り替えが簡単なので、プログラムの内容を変更しやすいといえるでしょう。これがよくオブジェクト志向の参考書で車の部品に例えられる理由です。
投稿2015/06/05 23:17
総合スコア1161
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
>selfはオブジェクト自身を指す。とか書いてあったんですがオブジェクトなんでサンプルソースの中にいくらでもあんだろ。目みえてんのかお前
その通り正解だと思います。 明示的に自分だよて解るためのselfですね。
オブジェクト指向について学ぶと、クラスの意味がわかるようになると思います。
教科書のサンプルは、クラス単体で完結しているのがほとんどなので、全然別ける意味もないですね。
ライブラリーにあるクラスを見ると、理解が深まると思います。
投稿2015/06/09 04:00
総合スコア1021
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。