Mixin类是抽象基类吗?在下面的示例中,对test_base的调用将失败,因为例如python无法解析self.assertEqual。
另外,PyCharm是不正确的,因为下面的标记Mixin类有未解决的属性错误?
class TestConverterMixin(object):
def setUp(self):
self.alt_hasher = getattr(hash, self.converter.__class__.__name__)
def test_base(self):
with self.settings(PASSWORD_HASHERS=[self.hasher, ]):
load_hashers(settings.PASSWORD_HASHERS)
for password in PASSWORDS:
orig = self.alt_hasher.encrypt(password)
conv = self.converter.from_orig(orig)
# see if we get a working hash:
self.assertTrue(check_password(password, conv))
# convert back and test with passlib:
back = self.converter.to_orig(conv)
self.assertEqual(orig, back)
答案 0 :(得分:5)
Mixin类是AbstractBaseClasses吗?你的案件最准确的答案是否定的,但可能应该如此。
作为一个独立的阶层,你所指出的原因无法生存。通过使它成为ABC,你明确地告诉任何看着你的类(如pycharm)的人
from abc import ABCMeta, abstractmethod
class TestConverterMixin(object):
__metaclass__ = ABCMeta
@abstractmethod
def assertEqual(self, other):
"Need concrete implementation somewhere"
.... the rest of your code
问题是你需要这个所有其他方法(self.AssertTrue,self.converter等)。你可能会想到别的东西,但这看起来只是我unittest.TestCase
的一个子类。
哦,PyCharm错了。不,他们做对了。如果你把它作为ABC或TestCase的子类,他们就不会抱怨。如果您使用了接口,比如zope.Interface,pycharm等通常会出错,因为他们不了解注册和查找过程。(它在python核心之外)
答案 1 :(得分:1)
我一直遇到麻烦让PyCharm不抱怨mixin类上未解决的属性引用错误。特别是,我也有mixin类,取决于其他mixin类,我无法从另一个继承。但后来我发现这个几乎完美的方式让PyCharm 2017.1开心:
class Human:
def is_male(self):
return True
class BeardMixin:
_facial_hair = {'length': 7, 'color': 'brown'}
def has_beard(self):
return True
class BeardLengthMixin:
"""Mixin for class Human with BeardMixin to provide get_beard_length()"""
def get_beard_length(self):
assert isinstance(self, (Human, BeardMixin))
# PyCharm will now not complain about any of these 3 attributes
if self.is_male() and self.has_beard():
return self._facial_hair['length']
assert语句为PyCharm提供了关于self可能是哪些类型的必要信息。但是有一个缺点:断言语句本身并没有按照你的想法行事:它只检查self是哪种类型,而不是两种类型。不幸的是,使用两个断言语句不起作用,因为就PyCharm的类型推导而言,第二个超越第一个。