Pythonのwithに対応したクラスの作り方と継承の仕方について

概要

Pythonのwithの使い方とwithに対応したclassの作り方,最後に継承の仕方をまとめました.


with

f = open( "data.txt" )
print( f.read() )
f.close()

with open( "data.txt" ) as f :
    print( f.read() )

と書ける.


withに対応したclass

withに対応したクラスを作るには以下のように__enter____exit__を用意する.

class Test :
    def __init__( self, str ) :
        print( "init" )
        self.str = str 
    def printStr( self ) :
        print( self.str )
    def __enter__( self ) :
        print( "enter" )
        return self
    def __exit__( self, type, value, traceback ) :
        print( "exit" )

with Test( "hogefuga" ) as t :
    t.printStr()

実行結果は以下の通り.

init
enter
hogefuga
exit

コンストラクタは__init__でデストラクタは__del__であるが,デストラクタはPythonがいつ呼び出すか分からないため通常使わない.Javaのようにスーパークラスのコンストラクタを実行したりはせず,ただのメソッドにすぎない.


(多重)継承

多重継承時は左側に書いたclassのmethodが実行される.Javaなどと違いスーパークラスのコンストラクタは実行されない.あくまでも__init__はただのメソッド.

class A :
    def __init__( self ) :
        print( "A" )
    def method( self ) :
        print( "A" )
class B(A) :
    def __init__( self ) :
        print( "B" )
class C :
    def __init__( self ) :
        print( "C" )
    def method( self ) :
        print( "C" )
    def method2( self ) :
        print( "method2" )
class D( A, C ) :
    def __init__( self ) :
        print( "D" )

print( "###" )
a = A()
print( "---" )
a.method()
print( "###" )
b = B()
print( "---" )
b.method()
print( "###" )
d = D()
print( "---" )
d.method()
d.method2()
print( "###" )

実行結果

###
A
---
A
###
B
---
A
###
D
---
A
method2
###
Tweet