Python Mixin - 未解析的属性引用 [PyCharm]
Python Mixin - Unresolved Attribute Reference [PyCharm]
我正在使用 mixin 将一系列功能分离到不同的 class。这个 Mixin 只能与唯一的 child class:
混合
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'。
我是否正确使用了混入模式? 有更好的方法吗?(我想在我的 mixins 中有类型提示和自动完成,我想有多个 mixins。)
所以只是从评论中为其他人整理我的想法:
问题是在分离功能的同时保持两个 classes 的内在联系。这是我的解决方案:
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) 制作一个class接受另一个class作为参数
在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())
在 Mixin 中声明必要的字段,例如:
class Mixin:
foo: str
def complex_operation(self):
return self.foo.capitalize()
通过这种方式,mixin 实际上声明了 class 必须能够使用此 mixin 的字段。如果扩展 class 会将不兼容的类型放入声明的字段,类型提示将创建警告。
编辑:按照@valex
的建议将 foo = None 替换为 foo:str
我看到几个选项。
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) 抑制 class 或特定行的未解决的引用错误(我认为这比前两个更脏):
# 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 只能与唯一的 child class:
混合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'。
我是否正确使用了混入模式? 有更好的方法吗?(我想在我的 mixins 中有类型提示和自动完成,我想有多个 mixins。)
所以只是从评论中为其他人整理我的想法: 问题是在分离功能的同时保持两个 classes 的内在联系。这是我的解决方案:
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) 制作一个class接受另一个class作为参数
在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())
在 Mixin 中声明必要的字段,例如:
class Mixin:
foo: str
def complex_operation(self):
return self.foo.capitalize()
通过这种方式,mixin 实际上声明了 class 必须能够使用此 mixin 的字段。如果扩展 class 会将不兼容的类型放入声明的字段,类型提示将创建警告。
编辑:按照@valex
的建议将 foo = None 替换为 foo:str我看到几个选项。
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) 抑制 class 或特定行的未解决的引用错误(我认为这比前两个更脏):
# noinspection PyUnresolvedReferences
class Mixin:
def complex_operation(self):
return self.foo.capitalize()
class Mixin:
def complex_operation(self):
# noinspection PyUnresolvedReferences
return self.foo.capitalize()