こんにちは、ナナです。
前回記事の『Python オブジェクト指向入門【変数とオブジェクトの関係】』では、Python上で扱う「数」や「文字列」はオブジェクトであると解説しました。
次はオブジェクトを操るための『メソッド』の使い方について解説します。
本記事では次の疑問点を解消する内容となっています。
では、オブジェクトにおける『メソッド』の役割について学んでいきましょう。
オブジェクトにおける『メソッド』の役割とは
『メソッド』って聞いたことあります。「タバタ式トレーニング 究極の科学的肉体改造メソッド」って本を持ってるんですよ。
これと同じ意味の『メソッド』ですか?
『メソッド』という言葉は一般的に「方法」「方式」なんて意味なんだね。
オブジェクト指向言語における『メソッド』というのは、オブジェクトを操作するための専用関数のことを言います。
『メソッド』とはオブジェクトを操作する関数
次のプログラムは文字列型オブジェクトとして”HELLO”を作成し、オブジェクトIDを表示したものです。
# 文字列オブジェクトの生成とID表示
print("HELLO", id("HELLO"))
HELLO 1872242103216
このように生成されたオブジェクトに対して、何らかの操作を行うための関数のことを『メソッド』と呼びます。
『メソッド』の種類は数多くあり、データ型によって種類が変化します。
つまり、整数型(int型)であるオブジェクトのメソッドと、文字列型(str型)であるオブジェクトのメソッドの種類は全然別のモノになります。
文字列型オブジェクトのメソッドを使ってみよう!
それでは『メソッド』という関数を呼び出して見ましょう。メソッドの呼び出し方にはルールがあります。
オブジェクト.メソッド名(引数)
これが、『メソッド』の呼び出し方です。
それでは、実際にプログラムから文字列型のメソッドを呼び出してみましょう。
# countメソッドの呼び出し
print("HELLO WORLD".count("L"))
print("HELLO WORLD".count("O"))
print("HELLO WORLD".count("H"))
3
2
1
countメソッドは、引数で指定した文字列が、オブジェクトの文字列の中にある個数を調べてくれるメソッドです。
オブジェクトに対して作用・操作を発揮するのが『メソッド』という関数の役割です。
オブジェクトを変えることで結果が変わるのが『メソッド』
このように『メソッド』とは、対象オブジェクトに対して作用・操作を行うための関数です。
つまり、オブジェクトが変わると実行結果が変わるのです。
print("HELLO WORLD".count("L"))
print("HAPPY NEW YEAR".count("L"))
print("WELCOME TO DISNEYLAND".count("L"))
3
0
2
このように、オブジェクト自体が異なる場合は『メソッド』の結果も変わるのです。
『オブジェクト』に対して『メソッド』という処理を実施する!
これが『メソッド』の作用です。これはめちゃくちゃ大事な性質ですよ!絶対に理解しておきましょう。
変数を利用した『メソッド』の呼び出し方
オブジェクト.メソッド(引数)の形で呼び出せるのが『メソッド』なんですね。なるほど。ん?ちょっと待ってください‼
プログラムの中で『変数』ってよく使うじゃないですか?メソッド呼び出すときに『変数』は使えないんですか?
もちろん、『変数』を使って『メソッド』を呼び出すことは可能だよ。Pythonにおいて『変数』とはオブジェクトを参照するための道具だからね!
プログラムの中では、オブジェクトを『変数』から利用する方が一般的ですね。そのため、メソッドは変数からも呼び出すことができます。
変数から『メソッド』を呼び出そう!
変数から『メソッド』を呼び出すと言っても特別なことはありません。
変数名.メソッド名(引数)
として呼び出すだけです。
次のプログラムは、変数「string1」に文字列オブジェクト”HELLO WORLD”を設定してメソッドを呼び出しています。
# 文字列オブジェクトを参照する変数定義
string1 = "HELLO WORLD"
# 変数を利用してcountメソッドを呼び出す
print(string1.count("L"))
3
結果はもちろん、オブジェクト.メソッド(引数)で呼び出したものと同じです。
『変数』から『メソッド』を呼び出す!この呼び出し方は、これからたくさん登場します。
文字列型の『メソッド』の種類
「文字列」という文字の情報に対して、様々なことができる便利な『メソッド』があらかじめ用意されているんですね。
すごく便利じゃないですか!countメソッド以外にも、メソッドはたくさんあるんですよね!
その通り、便利でしょ。文字列に関する『メソッド』には、文字列ならではの関数達がたくさんそろっているということだね。
文字列型にはたくさんの種類のメソッドが用意されています。少しだけ紹介しましょう。
文字列型の変換系のメソッド紹介
文字を変換するためのメソッドには、次のようなものがあります。
メソッド | 概要 |
capitalize | 先頭の1文字だけ英大文字にし、それ以外を英小文字とする |
upper | 全ての文字を英大文字とする |
lower | 全ての文字を英小文字とする |
swapcase | 英大文字と英小文字を反転させる |
title | 単語区切りの先頭を英大文字とし、残りを英小文字とする |
実際に使用したプログラムは次のものになります。
# 文字列オブジェクトを参照する変数定義
string1 = "HELLO world"
# 文字列の英小文字・小文字変換用のメソッド
print(string1.capitalize(), ":capitalize")
print(string1.upper(), ":upper")
print(string1.lower(), ":lower")
print(string1.swapcase(), ":swapcase")
print(string1.title(), ":title")
Hello world :capitalize
HELLO WORLD :upper
hello world :lower
hello WORLD :swapcase
Hello World :title
注意すべき点は、これらの変換は元のオブジェクトには影響せず、新しい文字列オブジェクトを戻り値として生成することです。
string1 = "HELLO world"
# 文字列を英大文字変換
string2 = string1.upper()
print("変換前:", string1)
print("変換後:", string2)
変換前: HELLO world
変換後: HELLO WORLD
このように変換前の「HELLO world」オブジェクトの内容は変わっていません。
文字列型のオブジェクトは「immutable(変更不可)」と呼ばれています。
そのため、一度オブジェクトとして生成した後からは、オブジェクトの内容を変更することはできません。つまり、変換系のメソッドでは新しい文字列をオブジェクトを生成することになります。
Q&A:Pythonのオブジェクトに関するよくある質問
オブジェクトについて質問ある人はどうぞ!
Q:文字列型が「immutable(変更不可)」ってどういうこと?
文字列型というものが「immutable」というのは『メソッド』で内容を変更することができないってことなんですか?
例えば文字列型のオブジェクトは、オブジェクトが生成されたときに文字列情報を管理することになります。
「immutableなオブジェクト」とは、一度生成した後のオブジェクト内容を書き換えることができないという意味です。
文字列型(str型)のオブジェクトは、次のように文字情報を取得することは可能です。
# 文字列オブジェクトを参照する変数定義
string1 = "Hello"
# オブジェクトの内容を読み取ることはできる!
string2 = string1[0]
print(string2)
H
しかし、次のように文字列内の文字を書き換えることはできません。
# 文字列オブジェクトを参照する変数定義
string1 = "Hello"
# 文字列オブジェクトの先頭文字を「A」に書き換え
string1[0] = "A"
File "C:/PythonProject/project1/main.py", line 5, in <module>
string1[0] = "A"
TypeError: 'str' object does not support item assignment
「’str’ object does not support item assignment:’str’オブジェクトはアイテム割り当てをサポートしていません」のエラーが発生します。
つまり、「オブジェクトの内容は書き換えできませんよ!」ということですね。これが「immutable(変更不可)」ということです。
オブジェクトのデータ型によって「immutable(変更不可)」か「mutable(変更可能)」かが異なります。
str型やint型は「immutable」なオブジェクトであり、後程紹介するlist型は「mutable」なオブジェクトです。
C言語技術者が知るべきPython言語との違い:メソッド
すでにC言語を習得している人は、次のポイントに気を付けよう!
Pythonはオブジェクト指向言語ですが、C言語はオブジェクト指向言語ではありません。
しかし、C言語において疑似的なオブジェクト指向を実現するための考え方が『ハンドル』なのです。
C言語の『ハンドル』について学び直したい人は『C言語入門 ファイルハンドルから学ぶハンドルの概念と作り方』を参考にしてください。
C言語を学んだ人は『ハンドル』の概念をしっかりと理解していると「オブジェクト指向」の考え方が身に付きやすいです。