Hatena::Grouppython

nelnal@python

2008-04-30

[] constモジュール 16:48  constモジュール - nelnal@python を含むブックマーク はてなブックマーク -  constモジュール - nelnal@python

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

[] 抽象メソッドを表現する 16:00  抽象メソッドを表現する - nelnal@python を含むブックマーク はてなブックマーク -  抽象メソッドを表現する - nelnal@python

現在のところ*1Pythonではクラスのメソッドを抽象表現する手段は無い。

しかし、調べてみると代わりとなる方法が分かったのでメモ。

参照1
http://newworld.ddo.jp/turky/358
参照2
http://d.hatena.ne.jp/syou6162/20070416/1176671387

どちらの場合でもスーパークラスで何らかの例外を発生させる方法で実装している。


その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 節があると問題が発生しづらくなる可能性がある。

*1:2008/01/29現在 Python最新安定版はVersion 2.5

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20080129

2007-11-07

[] オブジェクトのリストを参照 : dir() 23:34  オブジェクトのリストを参照 : dir() - nelnal@python を含むブックマーク はてなブックマーク -  オブジェクトのリストを参照 : dir() - nelnal@python

オブジェクトのリストを参照するのには dir を使用する。

dir( obj )


もし、グローバルスコープのオブジェクトリストを参照したければ引数無しで dir を使用する。

dir()

トラックバック - http://python.g.hatena.ne.jp/nelnal_programing/20071107