クラスとオブジェクトについて学んでいきましょう。
この記事は、クラスの内容を理解していることが前提となっています。
クラスについてイメージがわかない方は、クラスという記事を参考にして下さい。
整数や文字列も、実はクラスから作られたオブジェクト
クラスの記事の中では、オブジェクトを作ることによって、クラスが持つ変数やメソッドにアクセスすることができるとお伝えしました。
ここで、最初に学んだデータの型について思い出してみましょう。
文字列やリストにおいては、便利な関数が備わっているということをお伝えしました。
具体例を使って思い出してみましょう。
コードanimal = 'cat'
print(animal.upper())
アウトプットCAT
このように、upper()メソッドを使うことによって、文字列を大文字にすることができました。
ここで、なぜ文字列を大文字にすることができたのでしょうか。言い換えると、なぜ文字列にupperという関数を使うことができたのでしょうか?
この答えは、「文字列もクラスから作られたオブジェクト」だからです。
文字列オブジェクトを作成する
具体的な例を使ってみていきましょう。
a = str()
を実行してみます。
sが小文字になっているので、関数を実行しているように見えますが、strというのはクラスの名前です。
つまり、ここではstrというクラスからaというオブジェクトが作成されているのです。
本当にオブジェクトが作成されているのか、確認してみましょう。
コードa = str()
print(type(a))
アウトプット<class 'str'>
type関数を使うことによって、文字列型のオブジェクトが作成されたことが分かりました。
つまり、以下の2つのコードは同じことを意味しているのです。
a = str('cat')
a = 'cat'
言い換えると、Pythonはstr型を明示的に指定しなくても、自動的にデータの種類を判別し、そのデータの型に合わせてオブジェクトを作成してくれるのです。
つまり、a = 9というのは、a = int(9)と同じことであり、b = 1.1というのは、b = float(1.1)ということと同じなのです。
文字列で関数(メソッド)が使える理由
文字列もオブジェクトということが分かりました。
そうすると、文字列でも関数を使うことができるということを説明することができます。
なぜなら、文字列クラスからオブジェクトを作ることによって、文字列クラスが備えている関数を使うことができるようになるからです。
Pythonでは、整数型や文字列型などにおいて予め使える関数を定義してくれています。
具体的にどういった関数が定義されているのか確認してみましょう。
コードa = str()
print(dir(a))
アウトプット'__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__','__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__','__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__','__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__','__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__','__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center','count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map','index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower','isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower','lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition','rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title','translate', 'upper', 'zfill'
とても沢山の機能が備え付けられていることが分かります。
また、出力されたコードの最後の方に、この記事の初めの方で文字列に使ったupper関数も入っていることが分かります(太字部分を参考にしてみて下さい)。
データとオブジェクトの違い
色々な視点から、オブジェクトに対する理解を深めていきましょう。
例えば、C言語では、文字列はデータであり、オブジェクトではありません。
つまり、文字列に対して使える関数がないのです。
ですので、C言語で文字列を大文字にしたい場合は、小文字を大文字に変える関数を自ら作らなければいけません。
一方、オブジェクトの場合は、クラスが備えている関数を実行することができます。
データはその名前の通り、無機的なデータ。オブジェクトはクラスに備えられた関数にアクセスすることができる有機的なデータ。という整理をすると少しイメージがわくかもしれません。
クラスは鋳型、オブジェクトはそこから作られた実体
ここでは少し抽象的な考え方をしてみましょう。
オブジェクトがどういった機能を持つことができるのかは、クラスにどういった変数・関数が定義されているのかで変わってきます。
これは、クラスが鋳型のようなものと考えるとイメージがわきやすいかもしれません。
例えば、鍋の鋳型(クラス)から作られた鍋(オブジェクト)は、何かを保存することに役立ちます。
一方、包丁の鋳型(クラス)から作られた包丁(オブジェクト)は、何かを切ることに役立ちます。
このように、クラスの型に応じてオブジェクトでできることが変わってくる。というイメージを持つと、クラスとオブジェクトの関係が少しイメージしやすくなるかもしれません。
クラスとオブジェクトのまとめ
(1) Pythonでは、文字列も整数もオブジェクト。つまりクラスから作られる。
(2) オブジェクトは、クラスが備えている変数や関数を使うことができる。
(3) クラスは型のようなもの。
クラスとオブジェクトを学んだ後は
クラスとオブジェクトを理解した時におさえておきたい内容である、クラスメソッドの引数にselfを使う理由について学んでいきましょう。