こんにちは!ビーバー@ゲーム業界歴約20年python勉強中 です。
maya python初心者の方のために、カンタン・わかりやすい解説サイトを作っています。

maya pythonでGUIを作ろうと思って、やり方を調べてみたんだけど、
急にクラスとかいる感じになって、もうダメだよー!!

GUI作成関連のページをみてると、とたんにハードルが上がる感じがするよね。
説明している言葉がわかんなくて、何を言っているのかが分からん!という。。。
…こんなこと、ありますよね(笑)
まさに今、私も格闘しています。
ネットの情報は本職のテクニカルアーティストのものばかり。。
もっと駆け出しのスクリプト初心者向けのものはないかなあ(悲)と。
ご安心ください(笑)そんな皆さんのために、当サイトが全力で情報をまとめますよー☆
プログラムの謎用語は極力使わず、「初心者がわかる」解説をしていきます。
本日は、GUIを作成しようとするときに避けては通れない「クラス」!
これについて解説していきます。それではGO☆

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。
クラスとは?
クラスとは、「オブジェクトを作るための設計図」です。
そして、オブジェクトとは、変数とメソッド(関数)をセットにしたもの です。

オブジェクト指向、とか聞くアレのこと?
何のことかわからないんだけど。。

OK!じゃあまずオブジェクトから、超カンタンに解説するよ☆
オブジェクトとは?
具体例で見てみましょう。
例えば、「いろんな生き物とその行動をプログラムで作りたい」、という目的があったとします。
犬、を作れば「棒に当たる」「さんぽする」「犬小屋にはいる」「ほえる」の行動がよびだされ、
ネコ、を作れば「丸くなる」「ニャーとなく」「魚をぬすむ」「こたつに入る」などの行動が
カンタンに呼び出せるように、セットになっていれば便利ですよね?

そんな願いをかなえてくれるのがオブジェクトです。
・生き物の名前(犬とかネコ)を、変数として管理する
・その生き物にあった行動を、関数として管理する
・で、変数と関数をセットにして、
犬と言えば犬の行動がよびだされるし、ネコならネコものが呼ばれるようにする
オブジェクトは、このように、変数と関数をセットで管理することができる便利なものです。
ちなみに、オブジェクトに含まれる関数のことを「メソッド」と言います。

クラスとは?
そして、このオブジェクトを設計するのが「クラス」です。
例えば「生き物と行動のプログラム」だと、
・変数にはいるのは生き物の名前とする
・生き物ごとの行動を定義する
・生き物全般の名前と行動のセットを定義するこのクラスは「Animal」という名前にします
こういった「ルール作り」をクラスの中で行います。
そして、クラスのルールに沿って作られるのが「オブジェクト」です。

Animal クラスから、犬のオブジェクトを作り、犬の動作を呼び出す
Animal クラスから、ネコのオブジェクトを作り、ネコの動作を呼び出す
クラスとオブジェクトはこのようなイメージで利用されます。
ちなみに、クラスから生み出されたオブジェクトのことをインスタンスと言います。

ポリゴンでも、インスタンスコピーってやるアレだね!

そうだよ!インスタンスを使って、
「メッシュは親の形状を参照して、位置だけ子供側で情報を持つ」とかやるよね。
クラスで出てくるインスタンスも同じ概念だよ。
クラスについてまとめます。
- クラスとは、「オブジェクトを作るための設計図」です。
- オブジェクトとは、変数とメソッド(関数)をセットにしたもの です。
- オブジェクトに含まれる関数のことを「メソッド」と言います。
- クラスから生み出されたオブジェクトを、「インスタンス」と言います。
なんでGUI作成にクラスを使うの?
なんでGUIにクラスを使うのか、、ザックリいうと
「すでに作られたGUIパーツを改造して、素早く自分好みに組み上げられるから!」
です。
クラスには、「継承・オーバーライド」という機能があります。
いずれも、誰かが作ってくれたGUIの設計図をかりる、
自分好みに書き換えることができる機能になります。
継承のイメージ
親クラスを継承した子クラスを作ると、
親で定義されているメソッドを子で使いまわすことができます。
子クラスでは別途メソッドを追加することもできます。
下図の子クラスBでは、親クラスの行動1~4を使いまわし、追加行動1・2を足しています。

オーバーライドのイメージ
オーバーライドの機能を利用すると、親クラスの変数やメソッドの内容を
上書きした子クラスを作ることができます。
下図の子クラスBでは、親クラスの行動2・4をオーバーライドで上書きしています。

PySide や Qt というライブラリには、GUI作成の機能が多くあります。
これら機能を、そのまま使ってもいいし、クラスの「継承・オーバーライド」の機能を使って、
自分の目的に合わせた改造を入れて使うこともできます。
※PySide や Qt って何?という方はこちら
- クラスの、「継承・オーバーライド」という機能を使って、
外部ライブラリの機能を自分好みに上書きして使うことができるから

GUIを作るクラスを書いてみよう
それでは、GUIを作るクラスを書いてみましょう!
from maya import cmds
class TestWindow:
text = "初めてのクラス"
def createRingo(self):
cmds.window("リンゴ")
cmds.columnLayout()
cmds.button(label="リンゴ")
cmds.text(self.text)
cmds.showWindow()
def createMikan(self):
cmds.window("みかん")
cmds.columnLayout()
cmds.button(label="みかん")
cmds.text(self.text)
cmds.showWindow()
test1 = TestWindow()
test1.createRingo()
test1.createMikan()
このスクリプトで、「リンゴ」「みかん」という名前の カワイイ(?)ウィンドウが出来上がります。

今回は、これらの「ウィンドウを作るクラス」の作成を解説していきます。

スクリプトを詳しく解説していくね!
クラスの宣言
クラスは、class クラス名 の記述で始めます。
クラスの中身は、クラスの宣言後にインデントしている部分になります。
class TestWindow:
- class クラス名:
□□□□(インデント)以下、クラスの中身
□□□□ 中身
□□□□ ~~
□□□□ ~~

クラス名は、大文字で始めるようにしようね!
クラス変数を定義する
クラス変数の定義は、クラス宣言のすぐ下で行います。
class TestWindow:
text = "初めてのクラス"

text = “初めてのクラス” この部分だよ!
クラス変数とは?
同じクラスから生み出された、
すべてのオブジェクト(インスタンス)間で、共通した値をもつ変数 です。

今回のスクリプトでは、「初めてのクラス」という文字列を、クラス変数として定義します。

「リンゴ」「みかん」というウィンドウ(インスタンス)から、
共通した文字列をよびだすために、クラス変数を使ってみるよ!
クラス変数の書き方は、
class クラス名:
□□□□変数名 = 変数に入れる値
です。ここで作成したクラス変数は、この後につづく「メソッドを定義する」で呼び出して使います。

クラス変数って、普通の変数の書き方と一緒なんだね!
クラス変数についてまとめます。
- 同じクラスから生み出された、
すべてのオブジェクト(インスタンス)間で、共通した値をもつ変数 のこと - class クラス名:
□□□□変数名 = 変数に入れる値
で、定義する
メソッドを定義する
次に、GUIそのものを作る maya pythonコマンドを、メソッドとして定義しましょう!
メソッドとは?
クラスの中に含まれている関数のことを、メソッドと言います。
関数とは、ある目的に沿った処理を1つのコマンドにまとめることでしたね。
スクリプトのメソッド部分を見ていきましょう。
def createRingo(self):
cmds.window("リンゴ")
cmds.columnLayout()
cmds.button(label="リンゴ")
cmds.text(self.text)
cmds.showWindow()
def createMikan(self):
cmds.window("みかん")
cmds.columnLayout()
cmds.button(label="みかん")
cmds.text(self.text)
cmds.showWindow()
※maya cmdsでGUIを作る基礎は、こちら
リンゴウィンドウを作るメソッドは、createRingo()
みかんウィンドウのメソッドは、createMikan()です。
メソッドの定義も、関数と同様 def~ で開始します。
- クラスの中に含まれている関数のことを、メソッドと言う
- def メソッド名(self):
□□□□(インデント)以下、メソッドの中身
□□□□ 中身
□□□□ ~~
□□□□ ~~
「self」ってなあに?

メソッド名のカッコに「self」って入ってるよ。これはなあに?
self とは自分自身、つまりクラスから作られたオブジェクトのことです。
メソッドには、第1引数に必ず「self」を入れる、というルールがあります。
オブジェクトがメソッドを実行する際に、自身を受け取る挙動をとるためです。

・・・・・・・・はい?????
ちょっとややこしい(笑)ので、最初のうちは
メソッドは、カッコの中に「self」という名札をつけることで、クラスの一員と認識してもらえる
と覚えてしまった方がよいでしょう。
クラスやオブジェクトに慣れ、理解が深まってきたころに「self」を詳しく学習すると
分かりやすいと思います。
※メソッドの第1引数にselfを使う理由は、こちら

何はともあれ、「self」の第1引数(名札)がついているメソッドが、
クラスのメンバーだよ!図にするとこんなイメージ!

- メソッドに指定する「self」は、クラスから作られたオブジェクトのこと
- メソッドには、第1引数に必ず「self」を入れる、というルールがある
- メソッドは、カッコの中に「self」という名札をつけることで、
クラスの一員と認識してもらえる
クラス変数へのアクセス
次に、クラス変数を使っている部分を見ていきましょう。
このページ上部の、クラス変数を定義するの項目で、
「初めてのクラス」という文字列をクラス変数に入れました。
具体的にクラス変数を使っている部分はこちらになります。
cmds.text(self.text)

self.text これがクラス変数かな?また「self」がでてきたよ!?
cmds.text()は、GUIにテキストを表示させるmaya コマンドなので、
カッコの中に入っている「self.text」 こちらがクラス変数になります。
クラス変数は、呼び出し方にルールがあります。
- クラスの外から呼び出すときは、クラス名.クラス変数名
- クラスの中から呼ぶときは、self.クラス変数名 と書く
この例では、クラス内のメソッドからクラス変数を呼び出しているので、
self.クラス変数名と書きます。
スクリプト全体を見てみましょう。
from maya import cmds
class TestWindow:
text = "初めてのクラス"
def createRingo(self):
cmds.window("リンゴ")
cmds.columnLayout()
cmds.button(label="リンゴ")
cmds.text(self.text)
cmds.showWindow()
def createMikan(self):
cmds.window("みかん")
cmds.columnLayout()
cmds.button(label="みかん")
cmds.text(self.text)
cmds.showWindow()
test1 = TestWindow()
test1.createRingo()
test1.createMikan()
「self.text」は、TestWindowクラスの中の10行目と17行目、
createRingoメソッドとcreateMikanメソッドの中にあります。

ちなみに、、、
クラスの外から呼び出すときは「クラス名.クラス変数名」だよ!
クラスの外から呼び出している例↓

- クラスの外から呼び出すときは、クラス名.クラス変数名
- クラスの中から呼ぶときは、self.クラス変数名

オブジェクトを作成する
これまで、クラスの宣言~メソッドの定義を見てきました。
ここまでで、メソッドを持つクラス、つまりオブジェクトの設計図が出来上がりました。
次はいよいよ、この設計図からオブジェクトを作成します。
オブジェクトを作成する行はこちらです。
test1 = TestWindow()

ん?1行で終わった、、、、?

オブジェクトの作成自体は、1行でできるんだよ!
オブジェクト(インスタンス)は、
変数名 = クラス名()
で作成します。オブジェクトは変数に入れることで利用ができるのです。
pythonの変数は、オブジェクトも入れることができるんですね。
- オブジェクトは変数に入れて利用する
- 変数名 = クラス名() でオブジェクトを作成&変数に入れることができる
オブジェクトからメソッドを呼び出す
それでは、作成したオブジェクトからメソッドを呼び出してみましょう。
TestWindowクラスから作ったオブジェクト「test1」から、createRingoメソッドを呼び出します。
test1.createRingo()

オブジェクト名の後にドット「.」、メソッド名ってするのかな?

そうだよ!「.」は、「~のなかの」って意味で使われてるよ。
オブジェクトのメソッド呼び出しは、
オブジェクト名.メソッド名
で行います。
もう一度スクリプトに戻って、
from maya import cmds
class TestWindow:
text = "初めてのクラス"
def createRingo(self):
cmds.window("リンゴ")
cmds.columnLayout()
cmds.button(label="リンゴ")
cmds.text(self.text)
cmds.showWindow()
def createMikan(self):
cmds.window("みかん")
cmds.columnLayout()
cmds.button(label="みかん")
cmds.text(self.text)
cmds.showWindow()
test1 = TestWindow()
test1.createRingo()
test1.createMikan()
3~18行目でクラスを作り、
20行目で、クラスから作成したオブジェクトを 変数「test1」にいれました。
21、22行目は「test1」オブジェクトからメソッドを呼び出しています。
ここで初めてメソッドの中身が実行され、ウィンドウの生成が行われます。

メソッドの呼び出しについてまとめます。
- メソッドは、オブジェクトを作成し、オブジェクト名.メソッド名 で呼び出す
まとめ
maya pythonを使った「クラス」についてご説明しました!
ポイントをまとめます。
クラスとは?
- クラスとは、「オブジェクトを作るための設計図」であり、
オブジェクトとは、変数とメソッド(関数)をセットにしたもの - オブジェクトに含まれる関数のことを「メソッド」、
クラスから生み出されたオブジェクトを、「インスタンス」という

ポリゴンの「インスタンス」、と同じ意味だね!
クラスがGUI作成でよく使われる理由は、
「クラスの「継承・オーバーライド」という機能を使って、
外部ライブラリの機能を自分好みに上書きして使うことができるから」
でした。
具体的なクラスの作成方法をまとめます。
- クラスは、class クラス名 の記述で始める
クラスの宣言後にインデントしている部分が、クラスの中身 - メソッドの定義は、通常の関数と同様 def~ で開始する
第1引数に必ず「self」を入れる、というルールがある
クラスを作ったら、変数名 = クラス名() でオブジェクトを変数に入れて使います。
そして、メソッドは、オブジェクト名.メソッド名 で呼び出すことができます。
以上、「クラスってなあに?」の解説でした!
クラスを理解して、自由にGUIを作成できるようになりたいですね☆
本サイトでは、引き続き
maya python で GUIを作成する方法を学習できるコンテンツを作成していきます。
また読みにきてくださいませ~☆
◆クラスやオブジェクトの学習にオススメコンテンツ
体系的に学ぶのに心強いコンテンツ!使ってみてよかったものをご紹介します。
【書籍 Python3 スキルアップ教科書】
説明がシンプルで明快!リファレンスとして手元に置いておきたい一冊。
コードと出力結果が多くのっていて、理屈じゃなく実体験で機能が理解できます。
Python3の試験を実施している「Pythonエンジニア育成推進協会」が書いているのも納得☆

【書籍 すっきりわかるpython入門】
今まで使ってきた変数も実はオブジェクトなんだよ、という説明がわかりやすかったです。
pythonのしくみに焦点を当てて解説がされている印象です。
よくわからなかった用語も、この1冊で知識が補強されましたよ!
【paizaラーニング】
クラスの説明は15本の動画があり、それぞれ5分程度の短い動画で、
思い立った時にサクッと勉強できるのがありがたかったです。
ブラウザ上でコードを書いて学習できるので便利。無料なのもうれしいポイント!

【Udemy】
オブジェクトの成り立ちからコードの書き方まで、とても丁寧に説明されています。
1回聞いただけで概要がすっと頭に入ってきました。
Python でわかる オブジェクト指向 とはなにか?【Python オブジェクト指向 の「なぜ?」を「徹底的に」解説】

【PyQ】
Pythonに特化したオンライン学習サービス。ブラウザのみで学習できます。
コードの「写経」があるのが特徴的で、体験しながら理解ができるしくみになっています。
ライトプランなら月々3040円。いつでも開始・終了できるのも気楽で良いですね。
無料で1週間のお試しもできますよ☆

クラスやオブジェクトを理解しようとすると、突然ハードルが上がって感じますよね。
オブジェクト指向プログラミングを使いこなすには、体系的な学習が必要になります。
「付け焼刃でなく、プログラミングについてしっかりした理解をしたい」
こんな人には、腰を据えて本格的な学習ができる「Recursion」という
オンライン学習サービスをおすすめします。
Recursionで学習すると、
特定の言語にしばられない応用のきく実践的な力がつくので、
自分で問題解決をしていけるようになります。
maya pythonでGUIを作る方法をもっと知りたい方はこちら。
cmdsで作る方法・PySideの紹介・PySideのかんたんなチュートリアルをまとめています。
PySideを使うときに必要になる、「クラス」についても徹底解説!
本サイトの【まとめ】 maya python 基礎 入門!では、
10回シリーズでmaya pythonの基礎が習得できるコンテンツを発信しています。
- ちまたのスクリプトを読んで、内容を理解したい
- mayaのスクリプトリファレンスの読み方を習得したい
- 自分で簡単なツールを書きたい
- 基礎的なmayaコマンドをpythonで使えるようになりたい
など、mayaでpython基礎を身に着けたい方は、ぜひご活用ください♪
コメント