こんばんは。きわさです。
今回は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
といった感じです。
