[英]python abstract base classes, difference between mixin & abstract method
[英]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.