将装饰器应用于__init__函数是否为pythonic?

时间:2019-09-30 21:59:05

标签: python python-decorators

需要对__init__()参数进行健全性检查。我们想将这种健全性检查逻辑转移到装饰器中。

我做了一些原型设计,似乎将装饰器应用于__init__()确实可行:

def my_dec(func):
    def wrapper(*args, **kwargs):
        print('a')
        func(*args, **kwargs)
    return wrapper

class testClass(object):
    @my_dec
    def __init__(self):
        print('b')

__init__上方有一个装饰器似乎有些混乱。但是除此之外,这还有什么缺点吗?有什么非精神病吗?

2 个答案:

答案 0 :(得分:4)

是的:Python的原则之一是使混乱最小化以提高可读性,这就是包装程序所做的。根据设计,__init__旨在初始化传递的参数-它具有以下优点:

  • 在阅读代码时,更容易理解给定类将使用哪些参数
  • 如果所说的包装器具有重要的功能(例如arg检查等),则它们比在{{中间的地方]更好地突出显示,并且更难错过 1}}
  • Keras在一个类似于曾经理解的init的方法周围使用两个包装器,因此并不少见


否:如果__init__出于任何原因而涉及调用其他方法,则包装程序也将应用于该方法-这是非常不希望的。堆叠包装纸还需要仔细设计。这些都违背了Python中的 explicitness 原理。它代表读者引入了其他解缠,否则将通过类方法避免。


判决:取决于。一般来说,没有。有时候,可以-可以提高可读性。

答案 1 :(得分:1)

我认为这里的“ pythonic”可能是主观的(我可能会轻描淡写),但我相信要遵循更标准的方法并在__init__内进行完整性检查,并在以后的调试或与团队合作时。

类似的事情似乎在做同样的事情,但感觉更自然,更容易遵循。

def sanity_check():
    print('a')
    #do checks here
    return True #or False

class testClass(object):

    def __init__(self):
        if sanity_check():
            print('b')