Đây là những gì tôi đã tìm thấy: Nếu bạn đặt thuộc tính là __abstractmethods__
thành bộ trống, bạn có thể khởi tạo lớp trừu tượng. Hành vi này được quy định tại PEP 3119:
Nếu kết quả __abstractmethods__
bộ không bị để trống, lớp được coi là trừu tượng, và cố gắng để nhanh chóng nó sẽ nâng TypeError.
Vì vậy, bạn chỉ cần xóa thuộc tính này trong thời gian thử nghiệm.
>>> import abc
>>> class A(metaclass = abc.ABCMeta):
... @abc.abstractmethod
... def foo(self): pass
Bạn không thể nhanh chóng A:
>>> A()
Traceback (most recent call last):
TypeError: Can't instantiate abstract class A with abstract methods foo
Nếu bạn ghi đè __abstractmethods__
bạn có thể:
>>> A.__abstractmethods__=set()
>>> A() #doctest: +ELLIPSIS
<....A object at 0x...>
Nó hoạt động cả hai cách:
>>> 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
Bạn cũng có thể sử dụng unittest.mock
(từ 3.3) để ghi đè hành vi ABC tạm thời.
>>> 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
Nguồn
2013-06-27 14:16:13
Tuyệt. Tôi sẽ thử với mã này trên một số thử nghiệm của tôi :). Cảm ơn! – bow