永远不会引发AttributeError或TypeError的Python类

时间:2013-07-17 22:58:11

标签: python oop python-2.7

实现从不抛出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,以便无论是否指定了记录器,该类仍然可以正常运行。

1 个答案:

答案 0 :(得分: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属性具有合理的值(即不是函数),如果你有代码检查它。