0

AttributeError または TypeError を決してスローしないクラスを実装する最良の方法は何ですか?

アイデアは、私はこのようなクラスを持っているということです

class A():
    def __init__(self):
        self.logger = NeverThrowClass()
    def set_logger(self, logger):
        self.logger = logger
    def do_stuff(self)
        self.logger.info('Stuff is being done.')
        pass

特定のクラス メソッドがクラス化されるたびに、何かをログ ファイルに書き込みます。ただし、ログ ファイルが指定されていない場合でも、クラス メソッドを機能させたいと考えています。にアクセスするたびに例外をキャッチできることはわかっself.loggerていますが、デフォルトのlogger属性をとにかく呼び出しを受け入れる魔法のようなNeverThrowClass()ものにし、丁寧に何もせず、Noneクラスが引き続き正常に機能するように属性値を返すようにしたいと思いますロガーが指定されているかどうか。

4

1 に答える 1

2

もしかして、こういうこと?

class DoNothing(object):
    def __getattr__(self, name):
        return lambda *args, **kwargs: None

基本的に、このクラスは、任意の数の引数を受け入れて を返す関数を使用して、任意の属性アクセスに応答しますNone

logger = DoNothing()
logger.info("Stuff is being done")  # does nothing

__getattr__()下位レベルではなく使用しているため__getattribute__()、メソッド以外のものが必要な場合は、そこに通常の属性をいくつか投げることができます。

class LoggerNot(DoNothing):
    loglevel = 0

これで、loglevel属性をチェックするコードがあれば、適切な値を持つ (つまり、関数ではない) 属性が得られます。

于 2013-07-17T23:07:27.873 に答える