我使用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。)
我看到的选择很少。
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()
在Mixin中声明必要的字段,如:
class Mixin:
foo:str
def complex_operation(self):
return self.foo.capitalize()
这样mixin实际上声明了一个类必须能够使用这个mixin的字段。如果扩展类将不兼容的类型放入声明的字段,则类型提示将创建警告。
编辑:用@valex建议的foo:str替换foo = None
因此,只需从其他人的评论中编译我的想法:问题是在分离功能时保持两个类本质上是连接的。这是我的解决方案:
有另一个文件,比如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))
在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())