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

由于它是 using__getattr__()而不是 lower-level __getattribute__(),如果你想要一些非方法的东西,你可以在那里扔一些常规属性。

class LoggerNot(DoNothing):
    loglevel = 0

现在loglevel,如果您有检查它的代码,那么您就有了一个具有合理值的属性(即不是函数)。

于 2013-07-17T23:07:27.873 回答