相关疑难解决方法(0)

确定对象的类型?

有一种简单的方法可以确定变量是列表,字典还是其他什么?我得到的对象可能是任何一种类型,我需要能够分辨出来.

python

1700
推荐指数
10
解决办法
167万
查看次数

可以在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
查看次数

如何创建抽象类属性(可能是只读的)

我花了很多时间研究这个,但没有一个答案看起来像我想要的那样.

我有一个带有类属性的抽象类,我希望每个子类都被强制实现

class AbstractFoo():
    forceThis = 0
Run Code Online (Sandbox Code Playgroud)

所以,当我这样做

class RealFoo(AbstractFoo):
    pass
Run Code Online (Sandbox Code Playgroud)

它会抛出一个错误,告诉我在实现之前它无法创建类forceThis.

我怎样才能做到这一点?

(我不希望该属性是只读的,但如果这是唯一的解决方案,我会接受它.)

对于一个类方法,我发现我可以做到

from abc import ABCMeta, abstractmethod

class AbstractFoo(metaclass=ABCMeta):
    @classmethod
    @abstractmethod
    def forceThis():
        """This must be implemented"""
Run Code Online (Sandbox Code Playgroud)

以便

class RealFoo(AbstractFoo):
    pass
Run Code Online (Sandbox Code Playgroud)

至少抛出错误 TypeError: Can't instantiate abstract class EZ with abstract methods forceThis

(虽然它不强制forceThis成为一种类方法.)

如何为类属性弹出类似的错误?

python abstract-class exception class-properties

5
推荐指数
1
解决办法
1257
查看次数