質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Python

    7464questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    7315questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Python 3.x

    5874questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Ruby on Rails 3

    99questions

    Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

クラスって存在する意味あるんですか?

受付中

回答 8

投稿

  • 評価
  • クリップ 12
  • VIEW 18K+
退会済みユーザー

退会済みユーザー

クラスに関して勉強しはじめたのですが、とくに使いどころというかメリットがみつかりません

たとえばこんなの
class sample:
    def __init__(self, s_1, s_2, s_3):
        self.s_1 = s_1
        self.s_2 = s_2
        self.s_3 = s_3

    def keisan(self):
        return self.s_1 * self.s_2 * self.s_3


ans = sample(2, 3, 4)
print(ans.keisan())
なんとなく頭にあること
1. 初期化メソッドのinitの引数にselfを指定して、上記のs_1, s_2のように書き、self.s_1 = s_1みたいにselfを使いアトリビュートに何かを指定することで、別の関数で使うときに使いまわし?ができる。

2.別の関数で初期化メソッドのアトリビュートを使うときはkeisan(self):みたいに引数にselfを指定しないと初期化メソッドのアトリビュートにアクセスできない。

3.つまりselfが肝である。

みたいなことでしょうか。そんな感じで全く分かってないまである。
あと、selfはオブジェクト自身を指す。とか書いてあったんですがオブジェクトなんでサンプルソースの中にいくらでもあんだろ。目みえてんのかお前
と言いたくなるくらいにselfが何なのか分かっていません。つまりselfは何なんでしょうか?
コーヒーも飲めない僕には理解できない概念なんでしょうか
教えてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 8

+18

これは、クラスの文法を教えるためのサンプルです。
英語の勉強の、This is a pen. みたいなものですね。「これって、どんな場面で言うの?」という疑問は持って当然です。

プログラミング経験が無い人が、オブジェクト指向のメリットを本当の意味で「実感」するのは難しいと思います。また、小規模(ソースが数ページくらい)のプログラムだとあまりメリットは無いです(ないことはない)。

また、Pythonは、オブジェクト指向が後付けなので、
  1.  メソッド(上記のkeisan)の仮引数にselfを明示的に書かないといけない
  2.  インスタンス変数(上記のs_1等)のクラス外への隠蔽が出来ない
等というオブジェクト指向言語としてみると、弱点があり(オブジェクト指向言語らしくないというか)、そのためにわかりにくくなっている面はあります。

RubyやJavaなど、最初からのオブジェクト指向言語の方が、「オブジェクト指向」をより理解できるのではないかと思います(言語としてPythonが劣っているという意味では無く、あくまでオブジェクト指向の観点から)。

オブジェクト指向に興味がある場合は、RubyとJavaの入門書を一冊ずつ読んでみるのがいいかと思います。
もちろん「オブジェクト指向入門」のようなタイトルの付いた本でもいいです。
そうじゃなくて、Pythonの勉強をしたいのなら、「This is a pen.はどういうときに使うんだ?」という疑問はいったん心にしまって、先に進みましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

お邪魔します。

たとえばpython固有の回答になりますが、pythonは関数型的なプログラミングも、オブジェクト指向プログラミングにも、手続き型の書き方もできてしまう言語です。
ちょっとしたテキスト処理をするスクリプトを書くときにわざわざクラス定義をすることはあまりないです。

少なくともpythonは3種類のパラダイムに対応することができる、ということです。
完全な関数型のエッセンスを成すには地獄を伴いますがwww、そうしてみるのもいい勉強ですね。
要するに、どれで書いてもよいのです。

ご質問の内容というのは要約すると、クラスが何故必要か、言い換えるとオブジェクト指向で何故作るのか、ということかなと思います。
どうしてオブジェクト指向という作り方が考え出されて、今でも世界的に使われているのか、過去の何を乗り越えるために考え出されたやり方なのか、それまでのやり方にはどういう問題があって、オブジェクト指向がどうやって解決し、クラスという機構がそのためにどう役立つのか、という理解がなければ、クラスが必要である理由もまたわからないのではないかと思います。

とても長い話なので、本当に興味がおありなら、この本をおすすめします。
(図書館なんかにもあると思います)
オブジェクト指向でなぜつくるのか

簡単に言うと、大きなソフトウェアを作るときに、色々な混乱を避けるためであり、より効率的にプログラムを作るためであり、...etcという感じです。

オブジェクト指向が持ち出された私の知る理由のうち、大きなものをいくつかあげると
①グローバル変数を無くし、すべての変数を何かのスコープに属させるため。
②処理を効率的に使いまわすため。
③同じ処理を何度も実装するのではなく、ひとつの処理はひとつのところに実装し、修正箇所を最小にするため。

こういったことを成すために、データが手続きを持つ、クラスという実装の単位が考案された、ということです。(間違ってたら指摘をお願いします。)

以上です。参考になりましたら幸いです。


投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

少し違う観点からオブジェクト指向言語のイメージを書いた記事を紹介します。
http://satoshi.blogs.com/life/2004/09/post.html

ざっくり要約すると、
関数型言語は英語のような言語で動詞が主体で、
オブジェクト指向言語は日本語のような名詞が主体ということ

「物」を先に考えることで、「動作」を限定して、
似たような物には似たような動作ができるようになるということです。

なので、selfはその「動作」に関わる「物」自身ってことですね

私はこの記事を読んでオブジェクト指向言語が好きになりました!

勘違い等有りましたらご指摘願います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/15 13:12

    ご紹介いただいた記事を読んで、もやもやが晴れました。目から鱗というか。今年一番の収穫です。

    キャンセル

+1

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 では、変数等の独立性が担保されているので、
問題発生は、少なくなることが、見込まれます。
ポーリング型システム(グルグル回しのプログラム)でも、
イベント(割込み)は、有ったりしましたので、
過去から、コードと、変数の独立性の担保は、面倒な問題でした。
⇒面倒にならない様に、割込み側では、改変される可能性のあるもの全てを
スタックに保存し、処理終了後、スタックから復帰させる事が、当たり前でした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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なども同じ設計思想です。

クラスからクラスへアクセスするときに、アクセスするクラスさえ変えてやれば(インターフェースから実装して同じ関数名であれば)、別の処理をするコードに瞬時に書き換えたりできたりします。(手続き型言語だと、仕様を変更しようとすると、それに関わる関数、変数などすべて書き換える必要があり、とても手間がかかる場合があります。)

このように、部品みたいにクラスは取り替えが簡単なので、プログラムの内容を変更しやすいといえるでしょう。これがよくオブジェクト志向の参考書で車の部品に例えられる理由です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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という名前にする慣例があります。
...

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-2

>selfはオブジェクト自身を指す。とか書いてあったんですがオブジェクトなんでサンプルソースの中にいくらでもあんだろ。目みえてんのかお前 

その通り正解だと思います。 明示的に自分だよて解るためのselfですね。
オブジェクト指向について学ぶと、クラスの意味がわかるようになると思います。
教科書のサンプルは、クラス単体で完結しているのがほとんどなので、全然別ける意味もないですね。
ライブラリーにあるクラスを見ると、理解が深まると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

-3

今は使いどころがわからなくても勉強しておいてください。
のちのちライブラリやフレームワークなどを使っていくうちにわかってきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7464questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • Ruby

    7315questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Python 3.x

    5874questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Ruby on Rails 3

    99questions

    Ruby on Rails3はRubyによって書かれたオープンソースのウェブフレームワークです。Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。