यहाँ मैं क्या पाया है है। यह व्यवहार PEP 3119 में निर्दिष्ट किया जाता:
हैं जिसके परिणामस्वरूप __abstractmethods__
सेट गैर खाली, वर्ग सार माना जाता है, और यह दृष्टांत के लिए लेखन त्रुटि बढ़ा देंगे प्रयास करता है।
तो आपको परीक्षण की अवधि के लिए इस विशेषता को साफ़ करने की आवश्यकता है। आप __abstractmethods__
ओवरराइड तो
>>> A()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class A with abstract methods foo
आप कर सकते हैं::
>>> import abc
>>> class A(metaclass = abc.ABCMeta):
... @abc.abstractmethod
... def foo(self): pass
आप नहीं कर सकते एक दृष्टांत
>>> 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
तुम भीउपयोग कर सकते हैं:
>>> A.__abstractmethods__=set()
>>> A() #doctest: +ELLIPSIS
<....A object at 0x...>
यह दोनों तरीकों से काम करता है(3.3 से) अस्थायी रूप से एबीसी व्यवहार को ओवरराइड करने के लिए।
>>> class A(metaclass = abc.ABCMeta):
... @abc.abstractmethod
... def foo(self): pass
>>> from unittest.mock import patch
>>> p = patch.multiple(A, __abstractmethods__=set())
>>> p.start()
{}
>>> A() #doctest: +ELLIPSIS
<....A object at 0x...>
>>> p.stop()
>>> A()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class A with abstract methods foo
स्रोत
2013-06-27 14:16:13
कूल। मैं अपने कुछ परीक्षणों पर इस कोड के साथ झुकाव करने की कोशिश करूंगा :)। धन्यवाद! – bow