2014/11/07

【Python】Class (1)

JavaScriptにもクラスがついたんですか?
http://js-next.hatenablog.com/entry/2014/11/01/034607

という感じで、
Pythonでのクラスについてです。


クラス分からん。


class testCls:
    a = 1
    b = 'abc'
 
    def testClsFunc( self ):
        return self.a


こういうやつですね。

クラスってなんですか?と調べると「オブジェクトの振る舞いを書いた設計図です」的なフレーズとか、職業の例とかリンゴの例とか出て来て、ごめんなさい全然ピンと来ないですってなるんですが。
データと処理をまとめた云々」あたりなら、ギリギリ分かりそうでやっぱりムムム…だったり。

(ちなみに、公式ドキュメントの「クラスの定義」はこのあたり
http://docs.python.jp/2/tutorial/classes.html
http://docs.python.jp/2/reference/compound_stmts.html#class
公式だけにきっと正しいことがスマートに書いてあるはずなんですが、(略))

そんなときは泥臭い感じに、ピンと来るところから分かろうとしてみます。
「継承」「カプセル化(情報隠蔽)」「ポリモーフィズム(多態性)」とかも、まずは一旦無視(笑


# 変数
a = 1
test = ['1', 'abc', 456]
hanako = { 'name':'hanako', 'height':158 }

ひどい言い方をすると「データに名前をつけて扱いやすくしたヤーツ」です。

# 関数
def testFunc():
    sphereName = maya.cmds.polySphere()
    pos = (1,2,3)
    maya.cmds.move( *pos )
 
    return sphereName

同じく「複数の処理をまとめ (て名前付けて扱いやすくし) たヤーツ」ですね。
(※この場合、事前に import maya しています。唐突にmaya内での例)

からの、クラスです。

# クラス
class testCls:
    a = 1
    b = 'abc'
 
    def testClsFunc( self ):
        return self.a

冒頭に書いたものと同じですが、
「データと処理をまとめた〜〜云々」というのは
つまり「変数と関数をまとめた」ということです。
「『データに名前をつけて扱いやすくしたヤーツ』と『複数の処理をまとめたヤーツ』をまとめて扱いやすくするヤーツ」というのがクラスです。
ただしそれが全てではありません。大事な一側面、くらいにとらえるのがよいかと。

関数についてもう一度考えてみます。
さきほどの testFunc() ではそうなってはいないのですが、
関数が、すでに用意された変数をなんか操作する・処理する、というのは普通なことです。
ある特定の関数(たち)でのみ使う変数もあるでしょう。

ある目的を実現する関数たちがあって、それらが使う変数がある、
と考えるとき、
該当する関数たちと変数たちは、「それらがまとまって一つの目的を実現する」という点で強い関連があると言えます。
もとから関連があるんだったら、じゃあそれをまとめて一つの単位にしてしまえばいいんじゃないかっていうときに、クラスに登場してもらうことができます。

この「目的」が、英語で言うところの「object」です。(※【形式ばった表現】)
http://ejje.weblio.jp/content/目的
この考え方を推し進めることで、目的ごとに書かれることによるコード可読性アップとか、クラス単位での差し替えなどによる柔軟性・メンテナンス性アップが見込めます。

クラスの例

下記のようなコードがあったとして、

a = 〜〜
b = 〜〜
c = 〜〜
d = 〜〜
e = 〜〜
f = 〜〜

def funcA( a,c ):
    # なにか処理
    return # なにか

def funcB( b,d,e ):
    # なにか処理
    return # なにか

def funcC( e ):
    # なにか処理
    return # なにか

こういう説明をつけられるとします(▼)

a = 〜〜
b = 〜〜
c = 〜〜
d = 〜〜
e = 〜〜
f = 〜〜

### 目的[1]のための関数
def funcA( a,c ):
    # なにか処理
    return # なにか

### 目的[2]のための関数
def funcB( b,d,e ):
    # なにか処理
    return # なにか

### 目的[1]のための関数
def funcC( f ):
    # なにか処理
    return # なにか

目的[1]は、関数 funcAとfuncC、変数 a,c,f で実現されています。
目的[2]は、関数 funcBと変数 b,d,e 。
目的ごとに分けられそうですね。

class object_one:
    a = 〜〜
    c = 〜〜
    f = 〜〜

    ### 目的[1]のための関数
    def funcA( self ):
        # 変数 a,c を使った処理
        return # なにか

    ### 目的[1]のための関数
    def funcC( self ):
        # 変数 f を使った処理
        return # なにか

class object_two:
    b = 〜〜
    d = 〜〜
    e = 〜〜

    ### 目的[2]のための関数
    def funcB( self ):
        # 変数 b,d,e を使った処理
        return # なにか

このように「変数や関数を入れておくフォルダ」みたいに使うことが出来ます。
でも、ただ「クラス=そういうフォルダ的なもの」というわけでもありません。
先に触れたように、これはいろいろな要素を含まないノン・オブジェクト指向な内容です。
逆に言うと、いろんな利点に目を瞑った状態でも、使えるは使えるということで。

多分つづきます



■ 参考

9. クラス — Python 2.7ja1 documentation
http://docs.python.jp/2/tutorial/classes.html

データモデル — Python 2.7ja1 documentation
http://docs.python.jp/2/reference/datamodel.html

Python のクラスシステム
http://www.shido.info/py/python7.html

Python の self とかクラスとかインスタンス変数とか @ YoshioriのBlog
http://d.hatena.ne.jp/Yoshiori/20090716/1247720811

Python初心者によるPythonのいいところ、はまりどころのまとめ @ webtech-walker.com
http://webtech-walker.com/archive/2010/10/13191417.html

クラス (コンピュータ) @ wikipedia
http://ja.wikipedia.org/wiki/クラス_(コンピュータ)

Javaのオブジェクト指向をエヴァで例えると超わかりやすい @ IT速報
http://blog.livedoor.jp/itsoku/archives/38228939.html



0 件のコメント:

コメントを投稿