Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

超絶簡単Pythonクラスのまとめ

概要

このページではPythonのクラス定義および使い方について簡単にまとめます。
紹介する項目は次のものです。

  1. クラス定義
  2. 継承
  3. 階層定義

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について記述したいと思います。