2008-04-30
■ [オブジェクト指向] constモジュール

Python クックブックの「6.2 定数を定義する」に const モジュールが記述されている。
で、他のクラスのアトリビュートに対しても const モジュール内の _const クラスが利用したくなり、
チョット改変した。
下から3行が改変部分。
# -*- coding: utf-8 -*- class _const( object ): class ConstError( TypeError ): pass def __setattr__( self, name, value ): if hasattr( self, name ): raise self.ConstError, "Can't rebind const(%s)" % name else: self.__dict__[ name ] = value def __delattr__( self, name ): if hasattr( self, name ): raise self.ConstError, "Can't unbind const(%s)" % name raise NameError, name import sys inst = _const() inst.Const = _const sys.modules[ __name__ ] = inst
これによって、
import const class Test( const.Const ): pass
ってな感じで使えます。
まぁ、ちょっとは役に立ちます。
コメント
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080430
2008-01-29
■ [オブジェクト指向] 抽象メソッドを表現する

現在のところ*1Pythonではクラスのメソッドを抽象表現する手段は無い。
しかし、調べてみると代わりとなる方法が分かったのでメモ。
どちらの場合でもスーパークラスで何らかの例外を発生させる方法で実装している。
その1
class Abstraction: def method(self): abstract class Implementation(Abstraction): pass inst = Implementation() inst.method
これを実行すると NameError が発生する。
Traceback (most recent call last):
....
NameError: global name 'abstract' is not defined
その2
「その2」は自作した例外を発生させるパターン
class ExceptionOfImplementation( Exception ) class Abstraction: def method(self): raise ExceptionOfImplementation class Implementation( Abstraction ): pass inst = Implementation() inst.method
これで抽象メソッドの実装を行わなかった時は自作した例外を発生させることで発見できる。
問題点
例外の型を指定しない except 節があると問題が発生しづらくなる可能性がある。
トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080129