Python Mixin - 未解析的属性参考 [PyCharm]

ika*_*men 20 python mixins pycharm

我正在使用 mixin 将一系列功能分离到不同的类。这个 Mixin 只应该与唯一的子类混合:

class Mixin:
    def complex_operation(self):
        return self.foo.capitalize()

class A(Mixin):
    def __init__(self):
        self.foo = 'foo'
Run Code Online (Sandbox Code Playgroud)

在我的方法Mixin.complex_operationPyCharm 中给出警告“未解析的属性引用 foo”。

我是否正确使用了 mixin 模式?有没有更好的办法?(我希望在我的 mixin 中有类型提示和自动完成功能,并且我希望有多个 mixin。)

ika*_*men 11

在 Mixin 中声明必要的字段,例如:

class Mixin:
    foo:str

    def complex_operation(self):
        return self.foo.capitalize() 
Run Code Online (Sandbox Code Playgroud)

这样 mixin 实际上声明了一个类必须能够使用这个 mixin 的字段。如果扩展类将不兼容的类型放入声明的字段中,类型提示将创建警告。

编辑:按照@valex 的建议将 foo = None 替换为 foo:str


val*_*lex 7

我看到的选择很少。

1)类型注释(我认为这是最干净的解决方案):

class Mixin:
    foo: str

    def complex_operation(self):
        return self.foo.capitalize()
Run Code Online (Sandbox Code Playgroud)

2) 默认None(@ikamen 选项):

class Mixin:
    foo = None

    def complex_operation(self):
        return self.foo.capitalize()
Run Code Online (Sandbox Code Playgroud)

3)抑制类或特定行的未解决的引用错误(我认为这比前两种方式更肮脏):

# noinspection PyUnresolvedReferences
class Mixin:
    def complex_operation(self):
        return self.foo.capitalize()
Run Code Online (Sandbox Code Playgroud)
class Mixin:
    def complex_operation(self):
        # noinspection PyUnresolvedReferences
        return self.foo.capitalize()
Run Code Online (Sandbox Code Playgroud)