代码之家  ›  专栏  ›  技术社区  ›  Gerges

使用MIXIN返回基类签名

  •  4
  • Gerges  · 技术社区  · 6 年前

    我有一节课 B 由多重继承定义。

    class A:
        def __init__(self, x, y):
          self.x = x
          self.y = y
    
    class AMixin:
        def __init__(self, *args, **kwargs):
          # do stuff
          super().__init__(*args, **kwargs)
    
    class B(AMixin, A):
        pass
    

    基本上MIXIN类重写了 __init__ ,类 的签名与 A .

    因为我在用 *args **kwargs 在Mixin类中 的初始化基于 的构造函数(功能上)。

    然而, 不知道他们会认为 的签名是 args kwargs ,这有点无益。

    我想这和让 inspect.signature 返回 的签名(而不是 AMixin )检查时

    from inspect import signature
    signature(B).parameters.keys()
    # odict_keys(['args', 'kwargs'])
    

    如何让它回归 ['x', 'y'] 相反呢?

    2 回复  |  直到 6 年前
        1
  •  1
  •   webh    6 年前

    B类 __init__ AMixin 上课。尽管 阿米欣 正在呼叫 super() **args **kwargs ,它的 函数可以根据需要执行任何逻辑。linter扩展函数内部运行的内容是没有意义的。

        2
  •  0
  •   Gerges    6 年前

    所以经过研究,在 this post class B 像这样的:

    from functools import wraps
    
    def BaseSignature(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            return f(*args, **kwargs)
        # Override signature
        wrapper.__signature__ = signature(f.__mro__[2])
        return wrapper
    

    那么 B 定义为:

    @BaseSignature
    class B(AMixin, A):
        pass
    

    signature(B) 给予 <Signature (x, y)> ,而且棉绒也很好用。

    虽然它的工作,它仍然不是理想的我,因为我有几十个,并没有期待添加相同的装饰到他们所有。