Pythonのクラスを使ってみる

こんばんは。きわさです。

今回はpythonのクラスについて見ていきます。
以下のように、Baseクラスと、それを継承したTestクラスを用意します。

class Base():
  def __init__(self, a):
    self.a = a
  
  def method1(self, num):
    return self.a * num
  
  def method2(self):
    return self.a * 2
  
  @classmethod
  def classmethod(cls, num):
    return num * num

class Test(Base):
  def __init__(self, b):
    super().__init__(10)
    self.b = b
  
  def method1(self, num):
    return super().method1(num) + self.b
  
  def method3(self):
    return self.a * 3
  
  @classmethod
  def classmethod(cls, num):
    return super().classmethod(num) * num

順に見ていきます。

class Base():
  def __init__(self, a):
    self.a = a

class {クラス名}: とすることでクラスを定義できます。
次に、def __init__(self, {任意の引数}): は、コンストラクタの定義で、インスタンス生成時に呼ばれます。
引数のselfはインスタンス自身が渡され、コンストラクタだけでなく他のインスタンスメソッドの定義でも、第一引数に必ず必要です。
そして、self.{変数名} = {値} で、メンバ変数を設定できます。

引数として 2 を渡してインスタンス生成すると以下のようになります。

>>> base = Base(2)
>>> print(base.a)
2

以下はインスタンスメソッドを定義しています。

  def method1(self, num):
    return self.a * num
  
  def method2(self):
    return self.a * 2

method1は引数1つ、method2は引数なしですね。
実行すると以下のようになります。

>>> print(base.method1(2))
4
>>> print(base.method2())
4

以下はクラスメソッドの定義です。

  @classmethod
  def classmethod(cls, num):
    return num * num

クラスメソッドは @classmethod をつけ、第一引数がselfではなく、clsとなっています。
{インスタンス名}.{メソッド名} ではなく、{クラス名}.{メソッド名} でアクセスします。

>>> print(Base.classmethod(2))
4

次はこのBaseクラスを継承してみます。

class Test(Base):
  def __init__(self, b):
    super().__init__(10)
    self.b = b
  
  def method1(self, num):
    return super().method1(num) + self.b
  
  def method3(self):
    return self.a * 3
  
  @classmethod
  def classmethod(cls, num):
    return super().classmethod(num) * num

class Test(Base): のようにクラス名のあとの括弧に、継承するクラス名を書きます。
ベースのクラスと同じメソッドを定義すれば、オーバーライドされます。
また、super().__init__(10) や super().method1(num) のように、super() を使って、ベースクラスのメソッドにアクセスすることもできます。

実行結果は以下のようになります。

>>> test = Test(3)
>>> print(test.a)
10
>>> print(test.b)
3
>>> print(test.method1(2))
23
>>> print(test.method2())
20
>>> print(test.method3())
30
>>> print(Test.classmethod(2))
8

といった感じです。

スポンサーリンク