[Python]クラスを使ってみる
Pythonでクラスを使う場合のまとめになります。
Pythonでクラスを定義する
1番最小なクラスを定義してみます。
class Person(): pass
これでクラスの作成は完了です。classの後に先頭が大文字で記載します。
中身は値もメソッドも何もないクラスですが、最低限のクラスは上記コードで実装できます。
ちなみに()パレンティスはなくても動きますし、()パレンティスの中にobjectを記述するという書き方もあります。
# パレンティスなしパータン class Person: pass
# パレンティスあり + object記述パターン class Person(object): pass
objectありの方がそれが基底クラスだと分かりやすいという側面もあるみたいです。
定義したクラスをインスタンス化するには、クラスを呼び出します。printで確認してみます。
class Person(object): pass someone = Person() print(someone) => <__main__.Person object at 0x10dba31d0>
クラス内で関数を定義する
次にクラス内で関数を定義します。メソッドとも呼びますが、これらクラスの関数は普段Pythonでコードを書くときに使用しています。例えば文字列のcapitalaizeメソッド。これは先頭文字を大文字にするメソッドですが、strクラスのメソッドです。
country = 'japan' print(country.capitalize()) => Japan
自身で定義したクラスにメソッドを定義してみます。
class Person(): def greet(self): print('hello') someone = Person() someone.greet() => hello
Pythonのクラスで定義したメソッドを使うには一度、インスタンス化して変数に代入し、.メソッド名で使用します。なお、クラス内部で関数を定義する際には第一引数にselfを記述します。
上記の例greetメソッドは単にhelloという文字列を出力するだけのメソッドなのでselfがなくても動きます。
しかし、何らかのクラス属性などを参照するなどしたメソッドを定義した場合にはselfがないと自身にアクセスできないのでエラーが返ってきます。
クラスの初期化(コンストラクタ)を使う
クラスを実体化(インスタンス)した時に自動的に呼び出されるメソッドを定義することができます。
クラスの多くはインスタンス化する時になんらかの初期状態を設定することが多いので、そういった時にクラスの初期化が役立ってきます。
クラスの初期化は__init__(self)の形で記述します。
class Person(): def __init__(self): self.name = 'Mike' def greet(self): print('Hello ' + self.name) someone = Person() someone.greet() => Hello Mike
Personクラスが呼び出されインスタンス化した時に、__init__メソッドが自動的に呼び出されます。
ここではPersonのname属性に’Mike’という文字列を代入しています。なお、self.nameのselfはクラス自身を現します。
クラスで引数を使う
次にPythonのクラスで引数を使ってみます。上記のコードではコンストラクタの中に’Mike’という文字列をname属性に代入していましたが、これを引数で任意の文字列を代入してみます。
class Person(): def __init__(self, name): self.name = name def greet(self): print('Hello ' + self.name) someone = Person('Mary') someone.greet() => Hello Mary
__init__メソッドの第一引数はselfですが、第二引数以下に記述します。
__init__ではなくメソッドに直接引数を渡したい
上記では__init__に引数(Mary)を渡していますが、greetメソッドで直接引数を渡すことはできないのでしょうか?
class Person(): def greet(self, name): print('Hello ' + name) someone = Person('Mary') someone.greet() => someone = Person('Mary') TypeError: object() takes no parameters
エラーが出てしまいました。objectはパラメーターを取りません。と怒られました。
__init__の場合だとインスタンス化と同時にパラメーターをクラス内に入れ込むことができましたが、そこそもgreetメソッドはインスタンス化と同時に実行されないメソッドなので、渡すことができません。
greetメソッドに引数を渡したい場合はメソッド呼び出し時に引数を渡してあげます。
class Person(): def greet(self, name): print('Hello ' + name) someone = Person() someone.greet('Mary') # ここで引数を渡す => Hello Mary