Aquí es lo que he encontrado: Si establece __abstractmethods__
el atributo de ser un conjunto vacío podrás crear una instancia de clase abstracta. Este comportamiento se especifica en PEP 3119:
Si el __abstractmethods__
conjunto resultante es no vacío, la clase se considera abstracta, y los intentos de crear una instancia que elevará TypeError.
Así que solo tiene que borrar este atributo mientras duren las pruebas.
>>> import abc
>>> class A(metaclass = abc.ABCMeta):
... @abc.abstractmethod
... def foo(self): pass
Usted no puede crear una instancia:
>>> A()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class A with abstract methods foo
Si reemplaza __abstractmethods__
puede:
>>> A.__abstractmethods__=set()
>>> A() #doctest: +ELLIPSIS
<....A object at 0x...>
funciona en ambos sentidos:
>>> 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
También puede utilizar unittest.mock
(desde 3.3) para anular temporalmente el comportamiento ABC.
>>> 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
Cool. Trataré de manipular este código en algunas de mis pruebas :). ¡Gracias! – bow