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

问题描述 投票:1回答:2

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

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'。

我正确使用mixin模式吗?有没有更好的办法? (我想在我的mixins中有类型提示和自动完成,我想有多个mixins。)

python pycharm mixins
2个回答
1
投票

我看到的选择很少。

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)抑制类或特定行的未解决的引用错误(我认为这比前两个更脏):

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

1
投票

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

class Mixin:
    foo:str

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

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

编辑:用@valex建议的foo:str替换foo = None


0
投票

因此,只需从其他人的评论中编译我的想法:问题是在分离功能时保持两个类本质上是连接的。这是我的解决方案:

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)创建一个类来接受另一个类作为参数

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())
© www.soinside.com 2019 - 2024. All rights reserved.