相关疑难解决方法(0)

Python 2.6,3抽象基类误解

当我使用ABCMeta和abstractmethod时,我没有看到我的期望.

这在python3中工作正常:

from abc import ABCMeta, abstractmethod

class Super(metaclass=ABCMeta):
    @abstractmethod
    def method(self):
        pass

a = Super()
TypeError: Can't instantiate abstract class Super ...
Run Code Online (Sandbox Code Playgroud)

而在2.6:

class Super():
    __metaclass__ = ABCMeta
    @abstractmethod
    def method(self):
         pass

a = Super()
TypeError: Can't instantiate abstract class Super ...
Run Code Online (Sandbox Code Playgroud)

除了ABCMeta之外,如果我从对象派生Super,它们也都可以正常工作(我得到了预期的异常).

如果我从列表中派生超级,他们都"失败"(没有例外).

我想要一个抽象基类作为列表但是抽象,并且在子类中具体.

我做错了,还是我不想在python中使用它?

python abstract-class

9
推荐指数
1
解决办法
2966
查看次数

可以在Python中声明一个抽象异常吗?

我想在Python中声明用户定义的异常的层次结构.但是,我希望我的顶级用户定义的class(TransactionException)是抽象的.也就是说,我打算TransactionException指定其子类需要定义的方法.但是,TransactionException永远不应该实例化或提出.

我有以下代码:

from abc import ABCMeta, abstractmethod

class TransactionException(Exception):
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码允许我实例化TransactionException...

a = TransactionException()
Run Code Online (Sandbox Code Playgroud)

在这种情况下a是没有意义的,而应该绘制一个例外.以下代码删除了TransactionException作为Exception... 的子类的事实

from abc import ABCMeta, abstractmethod

class TransactionException():
    __metaclass__ = ABCMeta

    @abstractmethod
    def displayErrorMessage(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这段代码正确地禁止实例化,但现在我不能提出一个子类,TransactionException因为它Exception不再是一个子类.

可以在Python中定义一个抽象异常吗?如果是这样,怎么样?如果没有,为什么不呢?

注意:我使用的是Python 2.7,但很乐意接受Python 2.x或Python 3.x的答案.

python oop python-2.7

6
推荐指数
1
解决办法
1319
查看次数

标签 统计

python ×2

abstract-class ×1

oop ×1

python-2.7 ×1