能够实例化python类,尽管它是抽象的(使用abc)



这是参考"使用python的abc模块创建抽象类"问题的答案。(作者@alexvassel,并被接受为答案)。

我尝试了这些建议,但奇怪的是,尽管按照建议使用abc的方式,它不适合我。因此,我把它作为一个问题贴在这里:

下面是我的Python代码:
from abc import ABCMeta, abstractmethod
class Abstract(object):
    __metaclass__ = ABCMeta
    @abstractmethod
    def foo(self):
        print("tst")
a = Abstract()
a.foo()

当我执行这个模块时,下面是控制台上的输出:

pydev debugger: starting (pid: 20388)
tst

与被接受的答案

相反
>>> TypeError: Can not instantiate abstract class Abstract with abstract methods foo

那么我做的是对还是错呢?为什么成功而不失败?谢谢各位专家的意见。

在Python 3中创建抽象基类时使用metaclass参数:

from abc import ABCMeta, abstractmethod
class Abstract(metaclass=ABCMeta):
    @abstractmethod
    def foo(self):
        print("tst")
a = Abstract()
a.foo()

在Python 2中,你必须这样分配元类:

import abc
class ABC(object):
    __metaclass__ = abc.ABCMeta
    @abc.abstractmethod
    def foo(self):
        return True
a = ABC()

触发TypeError

Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo

但是在Python 3中,将__metaclass__赋值为属性不起作用(如您所希望的那样,但是解释器不认为它是错误,只是像其他任何正常属性一样,这就是为什么上面的代码不会引发错误)。元类现在被定义为类的命名参数:

import abc
class ABC(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def foo(self):
        return True
a = ABC()

引发TypeError:

Traceback (most recent call last):
  File "main.py", line 11, in 
    a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo

相关内容

  • 没有找到相关文章

最新更新