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

能够实例化python类,尽管它是抽象的(使用abc),python,python-3.x,abstract-class,python-2.x,abstract-base-class,Python,Python 3.x,Abstract Class,Python 2.x,Abstract Base Class,这是关于“使用python的abc模块创建抽象类”的答案(由@alexvassel提供,并作为答案接受) 我尝试了这些建议,但奇怪的是,尽管我按照建议使用了abc方式,但对我来说却不起作用。因此,我将其作为一个问题发布在这里: 以下是我的Python代码: from abc import ABCMeta, abstractmethod class Abstract(object): __metaclass__ = ABCMeta @abstractmethod def

这是关于“使用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中,在创建抽象基类时使用
元类
参数:

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
引发
类型错误

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

我懂了。这是很好的信息。在我按照建议修改了定义之后,它就起作用了。谢谢。如果抽象类没有@AbstractMethod,那么您似乎可以实例化和调用它的方法。感谢您详细解释了为什么它不会在Python2中引发错误。我希望它能做到,而不是像我不想的那样默默地工作:(@jark interest您选择了Victory的代码,因为它对Python 3无效,实际上无法演示您所寻找的内容。Aaron Hall,感谢您的反馈。我接受Victory的答案,因为这是第一个出现的答案,我阅读并尝试了它,它按照我的预期工作。我不确定您为什么这么说“对于Python 3无效”?如果我将您在解决方案中发布的代码与Victory发布的代码进行比较,两者使用完全相同的逻辑。唯一的区别是您使用了“导入abc”(并反过来使用abc.abstract方法等)与Victory使用的“来自abc导入ABCMeta,abstractmethod”“用抽象的方法等等。没有任何个人反对你是为了胜利,我感谢你的详细回答。但是请再次告诉我,我是如何理解胜利的答案,以及为什么它不起作用,我会考虑接受你的。”JAKK他在《代码》> Ac= Actudio(<)/代码>(应该如此)和<代码>是无关紧要的,很明显他没有测试他的代码,他只是复制并修改了你的代码。不过,接受你认为对你帮助最大的答案。
Traceback (most recent call last):
  File "main.py", line 11, in 
    a = ABC()
TypeError: Can't instantiate abstract class ABC with abstract methods foo