我正在使用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。)
答案 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)
因此,从其他人的评论中总结出我的想法: 问题在于,在分隔功能时,两个类必须保持内在联系。这是我的解决方案:
具有另一个具有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
的{{1}}函数中,添加一个参数以接受__init__
,然后在其方法中使用该参数:
A