3.1 クラスの作成
Pythonでのクラス作成は、オブジェクト指向プログラミング(OOP)の重要な部分だよ。クラスを使うと、自分専用の属性やメソッドを持つ新しいデータ型を作成できるんだ。ここでは基本的な概念とPythonでクラスを作成する例を見てみよう。
基本概念
- クラス: オブジェクトを作成するためのテンプレート。クラスは、そのクラスのオブジェクトが持つ属性やメソッドを定義するよ。
- オブジェクト: クラスのインスタンス。オブジェクトはクラスで定義されたすべての属性とメソッドを持ってる。
- 属性: クラスまたはオブジェクトに関連付けられた変数。
- メソッド: クラスまたはオブジェクトに関連付けられた関数。
属性は、オブジェクトやクラス内の内部変数みたいなもの。メソッドは、クラス内で定義された関数のこと。これらの用語はOOPから来ていて、関数や変数と一緒に使われるよ。
新しいクラスを宣言(作成)するには、class
というキーワードを使用するよ。この操作の一般的な構文はこんな感じ:
class クラス名:
変数1 = 値1
変数N = 値N
def 関数1(self):
関数のコード
def 関数M(self):
関数のコード
基本的に、クラスは変数+関数を含む小さなプログラムみたいなもので、それを名前付きの「クラス名」領域にパックしたようなものだね。
クラスを作成した後、そのクラスのオブジェクト(インスタンス)を作成できるよ。このコードはさらに簡単に見えるんだ:
変数X = クラス名()
重要!
Pythonでは、変数名とメソッド名は小文字で始まるのが一般的。クラス名は大文字で始まるよ。また、クラス名にはアンダースコアを使用しないのが通例。クラス名が複数の単語で構成されている場合は、各単語を大文字で始めるんだ。
クラスやオブジェクトの変数にアクセスしたい場合、通常このようになるよ:
変数X.変数1 = 10
変数X.関数M()
でも、いくつか注意点があるから、後で紹介するね…
3.2 オブジェクトの操作
クラスもクラスのインスタンス(クラスのオブジェクト)もオブジェクトだから、どちらも独自の変数やメソッドを持ってるよ。
変数には2種類あるよ:
-
クラスの属性/変数/フィールド
(class property)
-
オブジェクトの属性/変数/フィールド
(object property)
さらに、メソッドには3種類あるよ:
-
クラスメソッド/関数
(class method)
-
オブジェクトメソッド/関数
(instance method)
-
スタティックメソッド
(static method)
メソッドは、その宣言方法と呼び出し方で区別されるよ。
オブジェクトメソッド
オブジェクトメソッドを宣言するとき、最初に必須のパラメータself
を渡す必要があるよ。このメソッドを呼び出すと、このパラメータにオブジェクトへの参照instance
が渡されるんだ。
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
上の例では、instance_method()
が実行されると、パラメータself
にオブジェクトmy_object
への参照が渡されていたよ。
クラスメソッド
クラスメソッドを宣言するときにも、最初に必須のパラメータcls
を渡す必要があるよ。このメソッドを呼び出すと、このパラメータにクラスへの参照(class object
)が渡される。また、クラスメソッドはデコレータclassmethod
でマークする必要があるんだ。以下の例を見てみよう:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
上記の例では、class_method()
が実行されると、パラメータcls
にクラスMyClass
への参照が渡されていたよ。
スタティックメソッド
スタティックメソッドを宣言するときには、何も渡す必要はないけれど、クラスの内部データにアクセスすることもできないんだ。また、このメソッドはデコレータstaticmethod
でマークする必要がある。以下の例を見てみて:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "このメソッドはインスタンスやクラスに依存しないよ"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
スタティックメソッドはクラスメソッドと似た呼び出し方だけど、オブジェクトやクラスへの参照は渡されないんだ。
3.3 クラス変数
クラス変数
クラス変数(属性)を宣言するには、クラス内の任意の場所で単に宣言するだけでいいよ。ただし、通常はクラスメソッドの宣言前に、クラスの最初に書くことが多い。例:
class MyClass:
attribute = "私はクラスの属性です"
@classmethod
def class_method(cls):
print(cls.attribute) # 私はクラスの属性です
my_object = MyClass()
MyClass.class_method()
クラス変数の値を読み取るか書き込む場合、cls
オブジェクトを使用するよ。
基本的に、クラス変数にはクラス名を通じてアクセスすることもできるんだ:
class MyClass:
attribute = "私はクラスの属性です"
@classmethod
def class_method(cls):
print(MyClass.attribute) # 私はクラスの属性です
my_object = MyClass()
print(MyClass.attribute) # 私はクラスの属性です
オブジェクト変数/フィールド
オブジェクト変数(instance)
はself
のフィールドのこと。単にself.name
を通じて操作するだけ。まさにこのために、self
オブジェクトが各オブジェクトメソッドに渡されるんだ。
例:
class MyClass:
attribute = "私はクラスの属性です"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("オブジェクトのフィールド name")
my_object.print_name() # "オブジェクトのフィールド name"
オブジェクトメソッドを呼び出すたびに、self
パラメータとして、メソッドを呼び出しているオブジェクトへの参照が渡されるんだ。異なるオブジェクトメソッドは、self
オブジェクトを使用して共通データにアクセスできるよ。
GO TO FULL VERSION