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