繁体   English   中英

使用mixin时返回基类的签名

[英]Returning signature of base class when using a mixin

我有一个由多重继承定义的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

基本上,混合类覆盖__init__方法,但是从使用用户类的点B ,类B的签名是相同A

因为我在mixin类中使用*args**kwargs ,所以B的初始化基于A的构造函数(在功能上)。

然而, 短信不会知道,他们会认为B的签名是argskwargs ,这有点无益。

我认为这是同样的问题,因为在检查B时让inspect.signature返回A的签名(而不是AMixin ),但现在这是我检查B时得到的:

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

如何让它返回['x', 'y']

B类__init__继承自AMixin类。 即使AMixin使用**args**kwargs调用super() ,它的__init__函数也可以根据需要执行任何逻辑。 对于linter来说,扩展函数内部的内容是没有意义的。

经过一些研究,并在这篇文章的帮助下,我提出了一个解决方案,通过装饰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)> ,而且linter也很好用。

虽然它有效,但它仍然不适合我,因为我有数十个,并没有期待为所有这些添加相同的装饰器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM