定义Python接口断言成员变量

时间:2017-05-22 10:02:36

标签: python class exception architecture member

我尝试在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的所有成员必须由继承类定义它们是完美的。

1 个答案:

答案 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):
    # ...