クラス

クラスとは

クラスは、変数と関数をまとめたものです。
クラスに属する関数をメソッドと言います。
通常、クラスはインスタンスを作成してメソッドの実行や、 変数への代入を行います。 ただし、クラス変数はインスタンスを作成しなくても参照・代入が可能です。
ひとつのクラスに対して、インスタンスはいくつでも作成可能です。 複数作られたインスタンスは、それぞれ別々の実体として メソッドの実行・変数への代入などを行うことができます。
メソッドのないクラスを作ると、C 言語の構造体のように扱うことができます。
継承することによって親クラスの変数・メソッドを受け継いで、 新たなクラスを作ることができます。

クラスは class によって定義されます。
class クラス名([親クラス名, ...]):
    クラス変数 = 初期値
    .
    .
    def メソッド名(self, ...):
        クラス名.クラス変数 = 値
        self.クラス変数 = 値
        self.インスタンス変数 = 値
        内部変数 = 値
        その他の Python 文
	.
	.
    .
    .

新スタイルクラス

クラスを定義するとき、継承する親クラス名をつけないと古いスタイルクラスになります。

class myClass1():
    def test():
        print 'hello'

継承するクラス名として、objeict を指定すると新しいスタイルクラスになります。

class myClass2(object):
    def test():
        print 'hello hello'

新しいスタイルクラスの方が機能が豊富で便利なので、 現在は新しいスタイルクラスを使うのが一般的です。

特殊なメソッド

クラス内で、以下の名前のメソッドを定義すると特別な意味になります。

__init__(self, ...)
クラスのインスタンスが作成されるときに実行されます。
コンストラクタと呼びます。
引数には、インスタンス作成時につけられた引数が渡ります。
__getattr__(self, name)
インスタンスの中に name という名前の変数が見つからなかったときに実行されます。
__getattribute__(self, name)
インスタンス中の name という名前の変数を参照したときに実行されます。
新スタイルクラスでのみ有効です。
__setattr__(self, name, value)
インスタンス中の name という名前の変数に value を代入したときに実行されます。

クラスの例

簡単な例で、クラスの機能を試して見ましょう。

例 1

最初に、hello World と表示するクラスを作ってみます。

例 2

helloWorld1 を元にして、インスタンス作成時に hello World の表示回数と、 後ろに追加する文字列を指定できるようにしてみましょう。 さらに、何も実行しない bye() というメソッドを追加します。

例 3

helloWorld2 を継承した helloWorld3 というクラスを作って、 bye() というメソッドを上書きし、 byebye() というメソッドを追加してみます。

クラスの使用例

さまざまなオブジェクトを作成して、横に並べるクラスを作ってみましょう。

  1. 以下の Python スクリプトを makeObjects1.py という名前で作ります。
    import maya.cmds
    
    class makeObjects1(object):
        __commandName = {'sphere': maya.cmds.sphere,
                         'cone': maya.cmds.cone,
                         'cylinder': maya.cmds.cylinder}
        def __init__(self, num=1, name='sphere'):
            self.num = num
            self.com = name
        def make(self):
            for i in range(self.num):
                self.__commandName[self.com]()
                maya.cmds.move(2*i, 0, 0)
    
  2. スクリプト エディタ の ファイル → スクリプトのロード によって makeObjects1.py を読み込んで、テンキーの Enter キーなどで実行します。
  3. スクリプト エディタ のインプットウインドウで以下のように実行してみます。
    >>> mobj = makeObjects1()
    >>> mobj.make()
  4. 次に、作成された球体を消去して、 スクリプト エディタ のインプットウインドウで以下のように実行してみます。
    >>> mobj.num = 3
    >>> mobj.make()
  5. もう一度、作成された球体を消去して、 スクリプト エディタ のインプットウインドウで以下のように実行してみます。
    >>> mobj.com = 'cone'
    >>> mobj.make()

スクリプトの解説

import maya.cmds
Maya モジュールをインポートします。
class makeObjects1(object):
makeObjects1 という名前のクラスの定義です。
object を継承しているので新しいクラス定義になっています。
__commandName = {'sphere': maya.cmds.sphere,
'cone': maya.cmds.cone,
'cylinder': maya.cmds.cylinder}
クラス変数 __commandName を初期化しています。
代入しているのは、作成するオブジェクトの名前を表す文字列をキーとする 辞書型です。
要素の値は、関数がそのまま入っています。
__commandName は名前の前に __ (アンダースコア 2 つ)が付いているので、 クラスやインスタンスから直接参照・代入はできません。 クラスや、インスタンスから直接、参照・代入されたくない変数に このような __ (アンダースコア 2 つ)付の変数名を使います。
def __init__(self, num=1, name='sphere'):
クラスのインスタンスが作られるときに、 実行されるメソッドです。
引数は、num が作成されるオブジェクトの数、 name がオブジェクトをあらわす名前です。
もし、このクラスのインスタンスを作成するときに、 引数を与えないと、num=1, name='sphere' で初期化されます。
たとえば、以下のように実行できます。
obj1 = makeObjects1() # num=1, name='sphere' で初期化
obj2 = makeObjects1(3) # num=3, name='sphere' で初期化
obj3 = makeObjects1(name='cone') # num=1, name='cone' で初期化
obj4 = makeObjects1(name='cylinder', num=2) # num=2, name='cylinder' で初期化
self.num = num
インスタンス変数 self.num にオブジェクトの数を代入します。
self.com = name
インスタンス変数 self.com に作成するオブジェクトの名前を代入します。
def make(self):
make という名前のメソッドの定義です。
for i in range(self.num):
self.num 回だけ for 文を繰り返します。
self.__commandName[self.com]()
__commandName[self.com] に入っている関数を実行します。
もし、self.com に 'sphere' が入っていれば、 maya.cmds.sphere() が実行されます。
maya.cmds.move(2*i, 0, 0)
作成したオブジェクトを X 方向に 2*i だけ移動します。

名前を間違った場合

makeObjects1 は com にオブジェクト名を代入することによって、 作成するオブジェクトの種類を変えることができるようになっていますが、 com__commandName に無い名前を代入するとエラーになります。 この場合に、エラーを表示しないで、間違った名前を代入しようとしたら 無視できるようにしておくと便利です。 (練習 2 を参照)

>>> mobj1 = makeObjects1()
>>> mobj1.com = 'cone' # 正しいオブジェクト名
>>> mobj1.make() # コーンが作成されます
>>> mobj1.com = 'polyCone' # 間違ったオブジェクト名
>>> mobj1.make() # 間違った名前で作成しようとするとエラーが表示されます。
# エラー: ('polyCone',)
# Traceback (most recent call last):
# File "<:maya console>", line 1, in <:module>
# File "<:maya console>", line 12, in make
# KeyError: ('polyCone',) #

練習

  1. 上の makeObjects1.py を参考にして makeObjects2.py という Python スクリプトを作り、 メソッド addCommand() , printCommands() を追加して、 作成できるオブジェクトの種類を増やしたり、 現在作成できるオブジェクトの種類を表示できるようにしてみましょう。
    printCommands(self)
    実行すると以下のように表示されます。
    >>> mobj2 = makeObjects2()
    >>> mobj2.printCommands()
    sphere
    cylinder
    cone
    addCommand(self, name, com)
    name
    追加するオブジェクトの名前(文字列)
    com
    追加するオブジェクトを作成する関数
    以下のように実行します。
    >>> mobj2 = makeObjects2()
    >>> mobj2.addCommand('polySphere', maya.cmds.polySphere)
    >>> mobj2.com = 'polySphere'
    >>> mobj2.make() # ポリゴンの球体が作成されます

  2. 上の makeObjects2.py を参考にして makeObjects3.py という Python スクリプトを作り、 com に間違った名前を代入しようとしても代入できないようにしてみましょう。
    (実行例)
    >>> mobj3 = makeObjects3()
    >>> mobj3.com = 'cone' # 正しいオブジェクト名
    >>> mobj3.make() # コーンが作成されます
    >>> mobj3.com = 'torus' # 間違ったオブジェクト名
    Not found torus # エラーメッセージを表示
    >>> mobj3.make() # 'torus' を無視してコーンが作成されます
    (ヒント)

まとめ

参考


Prev | Next
Home | Contents
Mail