Mixin类是抽象基类吗?

时间:2015-01-18 14:44:58

标签: python 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)

2 个答案:

答案 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的类型推导而言,第二个超越第一个。