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

时间:2019-03-17 17:25:13

标签: python pycharm mixins

我正在使用mixin将一系列功能分离到不同的类中。该Mixin仅应与唯一的子类混合:

 <android.support.constraint.ConstraintLayout 
           xmlns:android="http://schemas.android.com/apk/res/android"
           xmlns:app="http://schemas.android.com/apk/res-auto"
           xmlns:tools="http://schemas.android.com/tools"
           android:id="@+id/linearLayout"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           tools:context=".MainActivity"
           tools:layout_editor_absoluteY="25dp">

<include
        android:id="@+id/include2"
        layout="@layout/fragment_bottom_properties_dialog"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.492"
        app:layout_constraintStart_toStartOf="parent"/>

在我的方法class Mixin: def complex_operation(self): return self.foo.capitalize() class A(Mixin): def __init__(self): self.foo = 'foo' 中,PyCharm发出警告“ Unresolved Attribute Reference foo”。

我正确使用mixin模式吗? 有更好的方法吗?(我想在我的mixin中有类型提示和自动补全功能,并且我想有多个mixin。)

3 个答案:

答案 0 :(得分:2)

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

class Mixin:
    foo = None
    def complex_operation(self):
        return self.foo.capitalize() 

通过这种方式,mixin实际上声明了一个类必须能够使用此mixin的字段。 IDE的警告也会消失。

答案 1 :(得分: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()

答案 2 :(得分: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的{​​{1}}函数中,添加一个参数以接受__init__,然后在其方法中使用该参数:

A