Python Mixin - 未解析的属性引用 [PyCharm]

Python Mixin - Unresolved Attribute Reference [PyCharm]

我正在使用 mixin 将一系列功能分离到不同的 class。这个 Mixin 只能与唯一的 child class:

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

class A(Mixin):
    def __init__(self):
        self.foo = 'foo'

在我的方法中 Mixin.complex_operation PyCharm 给出了警告 'Unresolved Attribute Reference foo'。

我是否正确使用了混入模式? 有更好的方法吗?(我想在我的 mixins 中有类型提示和自动完成,我想有多个 mixins。)

所以只是从评论中为其他人整理我的想法: 问题是在分离功能的同时保持两个 classes 的内在联系。这是我的解决方案:

1) 制作模块

有另一个文件,比如 mixin.py,它具有 complex_operation 作为函数。而不是接受 self 作为参数,让它接受一个字符串:

# mixin.py

def complex_operation (foo: str) -> str: return foo.capitalize()

# main.py

from ai import complex_operation
class A: 
    def __init__(self): self.foo = "foo"
print (complex_operation (A().foo))

2) 制作一个class接受另一个class作为参数

Mixin__init__函数中,添加一个参数来接受一个A,然后在它的方法中使用:

# mixin.py

class Mixin: 
    def __init__(self, a: A): self.a = a
    def complex_operation(self): return self.a.foo.capitalize()

# main.py

from mixin import Mixin
class A:
    def __init__(self): self.foo = "foo"

print (Mixin (A()).complex_operation())

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

class Mixin:
    foo: str

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

通过这种方式,mixin 实际上声明了 class 必须能够使用此 mixin 的字段。如果扩展 class 会将不兼容的类型放入声明的字段,类型提示将创建警告。

编辑:按照@valex

的建议将 foo = None 替换为 foo:str

我看到几个选项。

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

class Mixin:
    foo: str

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

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

class Mixin:
    foo = None

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

3) 抑制 class 或特定行的未解决的引用错误(我认为这比前两个更脏):

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