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

クラスって何かは分かったんだけど、どうやって使ったらいいんだろ?
クラスの概要はつかんだんだが、それをどうやって活かしていくのか、、、?
迷うこと、ありますよね。
今回は、引数を使ったウィンドウの作り分けをやってみたいと思います。

引数を使ったウィンドウの作り分け、、、って?

例えば ウィンドウを作るクラスに、
「リンゴ」「みかん」っていう引数を渡せば、別々のウィンドウができる、
ってなったら便利でしょ?


わあ!便利だなあ!
この仕組みを作るには、クラスの「コンストラクタ」という機能を使います。
コンストラクタを使えるようになると、もっと楽にGUI作成ができるようになりますよ!
それではGO☆

※当サイトで紹介する商品は、アフィリエイトプログラムを利用しています。
コンストラクタとは?
コンストラクタとは、クラスからインスタンスを作るときに実行されるメソッド(関数)です。
クラスからインスタンスを作ることを「初期化」と言います。
コンストラクタを使うと、初期化時に特定の処理を実行したり、
インスタンスに初期値を持たせることができます。

- コンストラクタとは、クラスからインスタンスを作るときに実行されるメソッド
- クラスからインスタンスを作ることを「初期化」と言う
スクリプトを書いてみよう
コンストラクタを使ったスクリプトを見てみましょう。
from maya import cmds
class TestWindow:
text = "初めてのクラス"
def __init__(self, name):
self.name = name
def create(self):
cmds.window(self.name)
cmds.columnLayout()
cmds.button(label=self.name)
cmds.text(self.text)
cmds.showWindow()
test1 = TestWindow("リンゴ")
test1.create()
test2 = TestWindow("みかん")
test2.create()
このスクリプトを実行すると、図の2つのウィンドウができます。

def __init__(): ってなあに?
def __init__(): から始まる部分がコンストラクタです。
以下の2行になります。
def __init__(self, name):
self.name = name
コンストラクタは
def __init__(self, 〇〇〇〇):
□□□□(インデント)以下、コンストラクタの中身
□□□□ 中身
□□□□ ~~
□□□□ ~~
から始まる部分
コンストラクタの引数

コンストラクタの第1引数に入ってる selfってなあに?

クラスのメソッドには、第1引数にselfが入るルールがあるんだよ!
コンストラクタもクラスに含まれるメソッドなので、1つ目の引数はselfになります。
クラスってなあに?その1で解説しているので、気になる方は読んでみましょう!
※selfについて知りたい方はこちら → selfってなあに?
第1引数はselfとなるルールがあるので、第2引数意向を任意の変数として指定することができます。
この例では、第2引数に変数name を指定しました。
この後、コンストラクタの中でインスタンス変数として使えるようにします。
インスタンス変数ってなあに?
インスタンス変数とは、それぞれのインスタンスごとに独立した変数のことです。
インスタンス変数は、クラス内で呼び出して使うことができます。

???わかるような分からんような、、

下図の例だと、インスタンス変数は「犬」と「ネコ」ってことだよ!


お~~!!イメージついたよ!
じゃあ、インスタンス変数ってどうやって作るの?
def __init__(self, name):
self.name = name

スクリプトを見てみよう。2行目にself.name ってあるよね。
ここで定義がされているんだよ!
self.○○○ってなあに?
self.変数名 は、クラス内からインスタンス変数を呼び出すときの書式です。
「変数名」のままでは、インスタンス変数としてクラス内から呼び出せないため、
self.変数名 = 変数名 と呼び出せる形に代入して利用します。
def __init__(self, name):
self.name = name
この例では、変数name を self.name に代入しています。

そっかあ!呼び出せる形に入れなおしてる、ってことだったんだね。

そう!理由もあるんだけど、一般的に書かれる書き方だから、
おぼえちゃって、なれるほうが早いね。
self.変数名 は、クラス内からインスタンス変数を呼び出すときの書式です。

インスタンス変数を使う
インスタンス変数を使ってみましょう。メソッドの中から呼び出してみます。
def create(self):
cmds.window(self.name)
cmds.columnLayout()
cmds.button(label=self.name)
cmds.text(self.text)
cmds.showWindow()
2行目で ウィンドウ名を self.name に、4行目で ボタンの名前に self.name を指定しています。

クラスの中からだけ呼び出せるんだったよね。

そうだよ。外からだとエラーがでちゃうね。

インスタンスをつくる
クラスが書けたら、インスタンスをつくります。
test1 = TestWindow("リンゴ")
test2 = TestWindow("みかん")

この部分だね!
コンストラクタで2つの引数(self, name)を指定したので、
クラスからインスタンスを作成するときに2つの引数が必要になります。
ただ、pythonではインスタンス作成時の「第1引数の self は省略する」というルールがあるため、
第2引数の name に渡す値だけを指定すれば OKです。
つまり、TestWindow(“リンゴ”)の書き方で、
第2引数のに「リンゴ」という値を与えることができます。
pythonでは、インスタンス作成時の「第1引数の self は省略する」というルールがある
スクリプトを実行
インスタンスからメソッドを呼び出し、ウィンドウを作成してみましょう。
もう一度スクリプトに戻って、
from maya import cmds
class TestWindow:
text = "初めてのクラス"
def __init__(self, name):
self.name = name
def create(self):
cmds.window(self.name)
cmds.columnLayout()
cmds.button(label=self.name)
cmds.text(self.text)
cmds.showWindow()
test1 = TestWindow("リンゴ")
test1.create()
test2 = TestWindow("みかん")
test2.create()
18行目、21行目で createメソッドを実行しています。
test1のインスタンスには「リンゴ」の文字列が与えられたためリンゴウィンドウが、
test2には「みかん」が与えられたのでみかんウィンドウができましたね!


いろんな名前のウィンドウが、かんたんにできちゃうね☆
まとめ
今回は、コンストラクタについて解説しました!
コンストラクタとは、クラスからインスタンスを作るときに実行されるメソッド(関数)です。
クラスからインスタンスを作ることを「初期化」と言い、
コンストラクタ内で初期化時の処理を作ることができます。
また、インスタンスには、インスタンス変数を持たせることができ、
引数で受け取った値をインスタンス変数に代入する方法を紹介しました。

クラスがわかるようになってきたよ~☆

その調子!スクリプトを書いて実行してためすと、理解が早いから
ぜひためしてみてね☆
クラスの機能をおぼえて、楽にGUIを作成できるようになりましょう~!
◆クラスやオブジェクトの学習にオススメコンテンツ
体系的に学ぶのに心強いコンテンツ!使ってみてよかったものをご紹介します。
【書籍 Python3 スキルアップ教科書】
説明がシンプルで明快!リファレンスとして手元に置いておきたい一冊。
コードと出力結果が多くのっていて、理屈じゃなく実体験で機能が理解できます。
Python3の試験を実施している「Pythonエンジニア育成推進協会」が書いているのも納得☆

【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基礎を身に着けたい方は、ぜひご活用ください♪
コメント