Python界面断言成员变量已定义

2024-09-28 03:14:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python3.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的所有成员断言它们必须由继承类定义。你知道吗


Tags: self示例定义timedef错误情况update
1条回答
网友
1楼 · 发布于 2024-09-28 03:14:21

你在找^{} module。示例(Python2.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使其与Python3.6一起工作的唯一修改应该是替换这个(未经测试):

class ModuleInterface(object):
    __metaclass__ = abc.ABCMeta
    # ...

class ModuleInterface(metaclass=abc.ABCMeta):
    # ...

相关问题 更多 >

    热门问题