簡體   English   中英

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類是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核心之外)

我一直有麻煩讓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的類型推導而言,第二個超越第一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM