关于abc的标准文档和我阅读的其他教程都使用了定义抽象基类而不从对象继承的示例。

class Foo(object):
    def __getitem__(self, index):
        ...
    def __len__(self):
        ...
    def get_iterator(self):
        return iter(self)

class MyIterable:
    __metaclass__ = ABCMeta

    @abstractmethod
    def __iter__(self):
        while False:
            yield None

在过去,我总是让类继承对象来拥有新的类。我应该和ABC做同样的事吗?

最佳答案

MyIterable的元类声明为ABCMeta可以确保MyIterable的实例(或者更恰当地说,是MyIterable的子类,因为它是抽象基类)将是“新”样式。如果您要创建一个MyIterable子类的实例,如下所示,它将作为一个新的样式类。

class SubIterable(MyIterable):
    def __iter__(self):
        # your implementation here
        ...

>>> type(SubIterable())
<type '__main__'.MyIterable>

如果MyIterable确实是一个“旧”样式的类,type(SubIterable())将返回<type 'instance'>

关于python - python抽象基类应该从对象继承吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44565754/

10-10 16:36