2011-03-18 12 views
1

コーディング中に頻繁に行う必要があります。デコレータを使用して例外クラスを生成するPython

class MyClassException(Exception): 
    def __init__(self, _message): 
     self.message = _message 

class MyClass(object): 
    def __init__(self, value): 
     raise MyClassException("What's up?") 

すべてのExceptionから継承されたすべてのそれらのダミーのクラスは、ユニークなものが、名前を持っていないので、デコレータの呼び出しを介して、私の例外クラスを持つことができるのはいいことです。例えば、次のようなものが良いでしょう。

@generic_exception_class 
class MyClass(object): 
    def __init__(self, value): 
     raise MyClassException("What's up?") 

デコレータはそれが何で私に 構文 名エラーを与えないだろう呼び出されるまでMyClassExceptionの存在を作成する方法はありませんので。これをPythonで同様の方法で行う方法はありますか?

+0

デコレータは、クラスがインスタンス化されるとすぐに呼び出されます。問題はどこですか? –

+0

MyClassExceptionによって構文エラーが発生する前に定義されていません – ocivelek

+0

1)これは構文エラーではなく名前エラーです。 2)Pythonは '__init __()'が実際に呼び出されるまで存在しないことに気をつけません。 –

答えて

1

ここに1つの可能性があります。例外クラスは装飾されたクラスのメンバーであり、グローバルスコープではありません。

# The decorator 
def class_with_exception(cls): 
    def init(self, _message=''): 
     self.message = _message 
    excname = 'ClsException' 
    excclass = type(excname, (Exception,), {'__init__': init}) 
    setattr(cls, excname, excclass) 
    return cls 

# example usage 
@class_with_exception 
class MyClass(object): 
    def __init__(self): 
     raise MyClass.ClsException('my message') 

# raises and catches exception 
try: 
    MyClass() 
except MyClass.ClsException: 
    print 'catching exception' 
+0

実行可能なアイデアのようです:)ありがとう。私たちが何か良いことを見なければ、私はこの返答を受け入れることができます。 – ocivelek

関連する問題