是 Mixin 类 抽象基础 类
Are Mixin classes abstract base classes
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)
Mixin class是 AbstractBaseClasses 吗?对于您的情况,最准确的答案是否定的,但可能应该是。
由于您指出的原因,您的 class 作为独立的无法生存。通过将其设置为 ABC,您可以明确地告诉任何查看您的 class(例如 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
的子 class。
哦,PyCharm 错了。不,他们做对了。如果您将其作为 ABC 或 TestCase 的子class,他们就不会抱怨了。如果您使用接口,如 zope.Interface、pycharm 等通常会出错,因为它们不了解注册和查找过程。(它在 python 核心之外)
我一直难以让 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 可能是哪些类型的必要信息。但是有一个缺点:assert 语句本身并不像您认为的那样做:它只检查 self 是否属于任一类型,而不是是否属于这两种类型。不幸的是,使用两个 assert 语句是行不通的,因为就 PyCharm 的类型推导而言,第二个会覆盖第一个。
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)
Mixin class是 AbstractBaseClasses 吗?对于您的情况,最准确的答案是否定的,但可能应该是。
由于您指出的原因,您的 class 作为独立的无法生存。通过将其设置为 ABC,您可以明确地告诉任何查看您的 class(例如 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
的子 class。
哦,PyCharm 错了。不,他们做对了。如果您将其作为 ABC 或 TestCase 的子class,他们就不会抱怨了。如果您使用接口,如 zope.Interface、pycharm 等通常会出错,因为它们不了解注册和查找过程。(它在 python 核心之外)
我一直难以让 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 可能是哪些类型的必要信息。但是有一个缺点:assert 语句本身并不像您认为的那样做:它只检查 self 是否属于任一类型,而不是是否属于这两种类型。不幸的是,使用两个 assert 语句是行不通的,因为就 PyCharm 的类型推导而言,第二个会覆盖第一个。