我尝试在Python 3.6中实现一个接口(我知道它们在Python中不存在)。使用以下最小示例:
import time
class ModuleInterface:
# How often the module information is updated (int in seconds).
interval = None
def update(self):
raise NotImplementedError
class HardDisk(ModuleInterface):
###############################################################################
pass # First
###############################################################################
# def update(self): # Second
# time.sleep(self.interval) # Second
###############################################################################
hd = HardDisk()
hd.update()
代码应该为第一种情况产生NotImplementedError。在第二种情况下,我想得到一个类似的错误,但我不知道如何在Python中正确实现这一点。如果没有定义某个东西,接口的想法是产生错误。但是定义了interval,这就是为什么第二种情况会产生TypeError的原因。然而,这不是我想要的那种错误。断言ModuleInterface的所有成员必须由继承类定义它们是完美的。
答案 0 :(得分:0)
您正在寻找abc
module。例子(Python 2.7 - 你会在the 3.6 doc中找到py3例子):
import abc
import time
class ModuleInterface(object):
__metaclass__ = abc.ABCMeta
# How often the module information is updated (int in seconds).
interval = abc.abstractproperty()
@abc.abstractmethod
def update(self):
""" must be implemented """
class WrongHardDisk(ModuleInterface):
""" This one doesn't define `interval`
so it cannot be instanciated
"""
def update(self):
time.sleep(self.interval)
class HardDisk(ModuleInterface):
interval = 5
def update(self):
time.sleep(self.interval)
try:
# Will raise a TypeError
whd = WrongHardDisk()
except Exception as e:
print type(e), e
# this one will work as expected
hd = HardDisk()
hd.update()
AFAICT使其与Python 3.6一起使用的唯一修改应该是替换它(未经测试):
class ModuleInterface(object):
__metaclass__ = abc.ABCMeta
# ...
与
class ModuleInterface(metaclass=abc.ABCMeta):
# ...