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

Is it pythonic to apply decorator to __init__ function?

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

我做了一些原型设计,似乎将装饰器应用于 __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__上面有一个装饰器似乎有点乱。但除此之外,这有什么缺点吗?有什么非 pythnoic 的吗?

我认为 "pythonic" 这里可能是主观的(我很​​少使用 may)但我相信保持更标准的方法并在 __init__ 内进行健全性检查并在以后将猜测保持在最低限度在调试或与团队合作时。

类似的东西看起来做同样的事情,但感觉更自然,更容易理解。

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

class testClass(object):

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

是:Python的原则之一是尽量减少混乱以提高可读性,这就是包装器所做的。 __init__ 设计旨在初始化传递的参数 - 这有其好处:

  • 阅读代码时更容易理解给定的 class 将使用哪些参数
  • 如果所述包装器具有重要的功能(arg 检查等),它们 会比它们 更突出 并且 更难被遗漏 __init__
  • 中间的某个地方
  • Keras 在一个类似于 init 的方法周围使用了两个包装器,所以它并不完全不常见


否: 如果 __init__ 出于任何原因涉及调用其他方法,包装器也将适用于它——这可能是非常不受欢迎的。堆叠包装纸也需要仔细设计。这些都违背了Python中明确性的原则;它代表 reader 引入了额外的理清,否则通过 class 方法避免了。


结论:视情况而定。一般来说,没有。有时,是的 - 可以提高可读性。