Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mixin-未解析的属性引用[PyCharm]_Python_Pycharm_Mixins - Fatal编程技术网

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

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模

我使用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模式有更好的方法吗?(我希望在我的混音中有输入提示和自动补全功能,我希望有多个混音。)

因此,我想从其他人的评论中整理一下我的想法: 问题是在分离功能的同时保持两个类的内在连接。以下是我的解决方案:

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只是一个公告。