は、私が発見したものです。この動作はPEP 3119に指定されています。
結果__abstractmethods__
セットが空でない場合、クラスが抽象的と考えられ、それはTypeErrorを送出しますインスタンス化しようとしています。
この属性をクリアする必要があるのは、テストの期間だけです。
>>> import abc
>>> class A(metaclass = abc.ABCMeta):
... @abc.abstractmethod
... def foo(self): pass
あなたはインスタンス化カント:
>>> A()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class A with abstract methods foo
あなたは__abstractmethods__
することができますをオーバーライドする場合:
>>> A.__abstractmethods__=set()
>>> A() #doctest: +ELLIPSIS
<....A object at 0x...>
それは両方の方法を動作します:
>>> class B(object): pass
>>> B() #doctest: +ELLIPSIS
<....B object at 0x...>
>>> B.__abstractmethods__={"foo"}
>>> B()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class B with abstract methods foo
ます。またを使用することができます(3.3から)一時的なABCの動作を無効にします。
def concreter(abclass):
class concreteCls(abclass):
pass
concreteCls.__abstractmethods__ = frozenset()
return type('DummyConcrete' + abclass.__name__, (concreteCls,), {})
結果のクラス:あなたはおそらく、@jsbuenoによって提案されたconcreterのよりコンパクトなバージョンがあることができunittest.mock.patch()
class MyAbcClassTest(unittest.TestCase):
@patch.multiple(MyAbcClass, __abstractmethods__=set())
def test(self):
self.instance = MyAbcClass() # Ha!
Cool。私はいくつかのテストでこのコードを試してみる:)。ありがとう! – bow