超絶簡単Pythonクラスのまとめ
概要
このページではPythonのクラス定義および使い方について簡単にまとめます。
紹介する項目は次のものです。
- クラス定義
- 継承
- 階層定義
1.クラスの定義
クラスファイル
#! /usr/bin/env python # -*- coding: utf-8 -*- class SuperClass(object): #classの宣言 name = '' #public変数 __callcount = 0 #private変数 def __init__( self ): #コンストラクタ self.name = 'SuperClass' def call( self ): #メソッドのself記述の省略はできません。ちょっと面倒です。 self.__callcount = self.__callcount + 1 return self.name def getCallCount( self ): return self.__callcount def setName( self, name ): #第一引数はself,第二引数から通常引数 self.name = name def resetName( self ): self.name = '' def __privateMethod( self ): #privateメソッド print 'This is Private Method' def internalMethod( self ): self.__privateMethod() def __del__( self ): #親クラスのデストラクタ del self; #以下クライアント if __name__ == '__main__' : sc = SuperClass() print sc.call() sc.resetName() print sc.name sc.setName( 'hoge' ) print sc.name print sc._SuperClass__callcount #private的なクラス変数を呼び出し可能。 print sc.getCallCount() print sc.internalMethod() # publicメソッド → private的なメソッドの呼び出し print sc._SuperClass__privateMethod() #private的なメソッドの直接呼び出し実行結果
SuperClass
(空行)
hoge
1
1
This is Private Method
This is Private Method説明
- Pythonはインデントでの構文制御なのでclass宣言、変数宣言/メソッド宣言でインデントを揃えましょう。
- class クラス名( object ) : これがクラスの一般的な宣言です。
- 通常のクラス変数/メソッドの宣言はpublic扱いになりますが、アンダーバー×2(__)を接頭辞とするとprivate的な役割をする宣言になります。あくまで"private的"な宣言です。上の例のクライアント側では少々強引なやり方に見えますが、アンダーバーを設定していても外部から直接的に呼び出すことに成功しています。(print sc._SuperClass__callcount,print sc._SuperClass__privateMethod())
- __init__( self ) : コンストラクタ __del__( self ): デストラクタとなります。
- メソッドの宣言はdefを利用し、第一引数には必ずselfが入ります。毎回記述するのが面倒ですが、忘れないようにしましょう。
- メソッドの第二引数から本来の引数の受け渡しになります。def setName( self, name )といった感じです。
2 継承
子クラス定義
上のSuperClassを継承するChildClassを定義してみます。
class ChildClass( SuperClass ): #引数に親クラス名を定義 def __init__( self ) : SuperClass.__init__( self ) #親クラスのコンストラクタ呼び出し self.name = 'ChildClass' #クライアント if __name__ == '__main__' : cc = ChildClass() print cc.call() cc.resetName() print cc.name cc.setName( 'hoge' ) print cc.name継承の実行結果
ChildClass
(空行)
hoge継承の説明
- class クラス名 ( 親クラス名 ) : 子クラスの宣言になります。
- 親クラス名.__init__( self )といった記述で親クラスのメソッドを呼び出すことが可能です。
多重継承クラス定義
上のSuperClassと並列の関係の親となるExtensionClassを定義します。またSuperClass,ExtensionClassを多重継承できるようにChildClassを修正します。
class ExtensionClass( object ) : def __init__( self ) : self.name = 'ExtensionClass' def extension( self ) : print 'multiple inheritance' class ChildClass( SuperClass,ExtensionClass ) : #引数に親クラス名を定義 def __init__( self ) : SuperClass.__init__( self )#必ず子クラスで親のコンストラクタを呼び出す。 self.name = 'ChildClass' #client if __name__ == '__main__' : cc = ChildClass() print cc.call() cc.resetName() print cc.name cc.setName( 'hoge' ) print cc.name cc.extension()多重継承の実行結果
ChildClass
(空行)
hoge
multiple inheritance多重継承の説明
- class クラス名(親クラス、親クラス、・・・ ) : 多重継承する子クラスの宣言になります。
3 クラスの階層化
クラスの階層化定義
class SuperClass( object ) : class ChildClass( object ) : def __init__( self ) : self.name = 'ChildClass' class ChildChildClass( object ) : def __init__( self ) : self.name = 'ChildChildClass' if __name__ == '__main__' : sc = SuperClass() cc = sc.ChildClass() ccc = cc.ChildChildClass() print ccc.name;実行結果
ChildChildClass
説明
- インデントを利用して階層的にクラスを定義できます。
次回
Pythonのselfについて記述したいと思います。