9

这是参考“使用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

那么我在做什么是对还是错?为什么工作而不失败?感谢任何专家对此的见解。

4

2 回答 2

7

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

from abc import ABCMeta, abstractmethod

class Abstract(metaclass=ABCMeta):

    @abstractmethod
    def foo(self):
        print("tst")

a = Abstract()
a.foo()
于 2014-06-15T23:58:13.633 回答
5

在 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
于 2014-06-16T00:11:08.717 回答