【发布时间】:2011-02-21 04:09:48
【问题描述】:
当我使用 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 ...
在 2.6 中:
class Super():
__metaclass__ = ABCMeta
@abstractmethod
def method(self):
pass
a = Super()
TypeError: Can't instantiate abstract class Super ...
如果我从对象派生 Super,除了 ABCMeta,它们都可以正常工作(我得到预期的异常)。
如果我从列表中派生 Super,它们都会“失败”(不引发异常)。
我希望抽象基类是一个列表,但抽象,在子类中具体。
我做错了吗,还是我不应该在 python 中这样做?
【问题讨论】:
-
你到底想用这个实现什么?一个具体的例子在这里真的会有很长的路要走。
-
抽象基类是中毒心灵的需要 o_O stackoverflow.com/questions/372042/…
-
musicfreak:我正在尝试实现一个基于列表的抽象基类,它为其派生类定义了一个接口,并且不能实例化哪个基类。我希望能够将派生类用作列表,因为这是我的对象的本质,还有额外的接口位,因为我的对象更加特别。 :) msw:为什么需要 deiderata (“被毒化的头脑所渴望的东西”?我猜你是说我不应该想要这个(在 python 中),但是为什么呢?什么是更 Pythonic 的机制?
-
@msv,ABC 现在是 Python 2.6 及更高版本的重要组成部分——交易。 @Aaron,你没有做错任何事,只是没有按照你想要的方式工作——让我写一个答案来解释一下。
-
@Aaron,我是在夸张,但除了我提到的 SO 链接中的一些晦涩的情况外,有些人认为 Python 需要抽象类,就像鱼需要自行车一样。一个什么都不做的类在我看来不是一个类,它是一个接口定义。甚至在 Python 中包含 ABC 的理由也有些模棱两可:python.org/dev/peps/pep-3119
标签: python abstract-class