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

mypy:如何忽略mixin中的“缺少属性”错误

  •  1
  • kurtgn  · 技术社区  · 6 年前

    我无法让mypy正确使用mixin:它一直抱怨我的mixin引用了丢失的属性。考虑这个例子:

    class PrintValueMixin:
        """A mixin that displays values"""
    
        def print_value(self) -> None:
            print(self.value)
    
    
    class Obj(PrintValueMixin):
        """An object that stores values. It needs a mixin to display its values"""
    
        def __init__(self, value):
            self.value = value
    
    
    instance = Obj(1)
    instance.print_value()
    

    error: "PrintValueMixin" has no attribute "value"
    

    当然,它没有“值”属性。它是一个混合体,它不应该有自己的属性!

    1 回复  |  直到 6 年前
        1
  •  5
  •   pawelswiecki    6 年前

    我认为这是一个设计不完善的类层次结构的标志。mixin不应该依赖于类中继承它们的东西。我知道这是针对duck类型的,但是我们处于“静态”类型领域,这里的规则更严格。

    如果希望在不重构代码的情况下解决此问题,可以执行以下操作:

    class PrintValueMixin:
        """A mixin that displays values"""
        value: int   # or whatever type it has
    
        def print_value(self) -> None:
            print(self.value)                                
    

    value 作为类属性。注意它是未初始化的 价值