考虑以下场景。
import six
from abc import ABCMeta, abstractmethod
class ThisIsAnAbstractClass(six.with_metaclass(ABCMeta)):
@abstractmethod
def __init__(self,parameter):
self.parameter = parameter
def do_something():
"""do something"""
有一个类的扩展形式ABCMeta(一个抽象类),里面有一个抽象方法。由于该抽象 init() 方法,无法初始化此类。有没有办法测试这个类? (至少使用任何测试框架)
创建抽象类的子类,然后测试子类。
from abc import ABCMeta, abstractmethod
class ThisIsAnAbstractClass(object):
__metaclass__ = ABCMeta # <--
@abstractmethod
def __init__(self, parameter):
self.parameter = parameter
def do_something():
"""do something"""
class ConcreteClass(ThisIsAnAbstractClass):
def __init__(self, parameter):
super(ConcreteClass, self).__init__(parameter)
try:
ThisIsAnAbstractClass('test')
assert False, 'Abstract class instance created!'
except TypeError:
pass
assert ConcreteClass('test').parameter == 'test'
注意:您应该使用 abc.ABCMeta
作为元类。