Python Mixin-未解析的属性引用[PyCharm]
我使用mixin将一系列功能分离到不同的类。此Mixin应仅可与独子类混合:Python Mixin-未解析的属性引用[PyCharm],python,pycharm,mixins,Python,Pycharm,Mixins,我使用mixin将一系列功能分离到不同的类。此Mixin应仅可与独子类混合: class Mixin: def complex_operation(self): return self.foo.capitalize() class A(Mixin): def __init__(self): self.foo = 'foo' 在我的方法中,Mixin.complex_操作PyCharm给出警告“未解析属性引用foo” 我是否正确使用了mixin模
class Mixin:
def complex_operation(self):
return self.foo.capitalize()
class A(Mixin):
def __init__(self):
self.foo = 'foo'
在我的方法中,Mixin.complex_操作
PyCharm给出警告“未解析属性引用foo”
我是否正确使用了mixin模式有更好的方法吗?(我希望在我的混音中有输入提示和自动补全功能,我希望有多个混音。)因此,我想从其他人的评论中整理一下我的想法: 问题是在分离功能的同时保持两个类的内在连接。以下是我的解决方案: 1) 制作模块 还有另一个文件,比如说
mixin.py
,它的函数是complex\u操作。不要接受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
的函数中,添加一个参数以接受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实际上声明了类必须能够使用此mixin的字段。若扩展类将不兼容的类型放入声明的字段中,类型提示将创建警告
编辑:按照@valex的建议,将foo=None替换为foo:str,我看到的选项很少
1) 类型注释(我认为这是最干净的解决方案):
类混合:
foo:str
def综合_操作(自):
return self.foo.capitalize()
2) 默认值None
(@ikamen选项):
类混合:
foo=无
def综合_操作(自):
return self.foo.capitalize()
3) 抑制类或特定行的未解析引用错误(我认为这比前两种更脏):
#无检查PYUNsolvedReferences
类Mixin:
def综合_操作(自):
return self.foo.capitalize()
类混合:
def综合_操作(自):
#无检查未溶解参考
return self.foo.capitalize()
I复制并粘贴您的代码并打印(A().complex_operation())
printed“Foo”。还有更多我们应该看到的代码吗?至于更好的方法,继承适合混合,类型提示+自动完成完全取决于您对IDE的选择。是的,它可以工作-但正如前面提到的IDE抱怨的那样,我没有自动完成功能…您使用的是哪个IDE?它不应该计算函数中的变量,因为即使是Python也不这样做——正是出于这个原因。我使用的是PyCharm。它确实检查我是否在使用现有变量,但它当然允许我执行代码,即使它怀疑代码有问题。我对PyCharm了解不多,但它似乎希望self
有foo
,但Mixin
没有。它有一个要点——并不是每个使用这个mixin的类都保证有一个foo
。也许您希望foo
成为Mixin
的类属性(或者至少在\uuuu init\uuuu
中设置),而不是a
。在某些情况下,我喜欢模块解决方案。我们应该记住这种可能性。我认为类型注释严格地说比无注释好。我也把它放在了我的答案中。类型注释版本是否设置了一个类变量foo
,值为“
”,或者它只是一个声明?如果您希望有一个方法,那么这将如何工作?@Minix-type-annotation只是一个公告。