Python抽象类的新写法

955次阅读  |  发布于5年以前

记得之前learn python一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下 最简单的写法


    class MyCls():
      def foo(self):
        print('method no implement')

    运行的例子


    >>> a = MyCls()
    >>> a.foo()
    method no implement
    >>>

这样虽然可以用,但是提示不明显,还是容易误用,当然,还有更好的方法 较为可以接受的写法


    class MyCls():
      def foo(self):
        raise Exception('no implement exception', 'foo method need implement')

一个简单的用例


    >>> a = MyCls()
    >>> a.foo()
    Traceback (most recent call last):
     File "<interactive input>", line 1, in <module>
     File "<clipboard>", line 3, in foo
    Exception: ('no implement exception', 'foo method need implement')

这就是2.7之前的写法了,2.7给了我们新的支持方法!abc模块(abstruct base class),这个在py3k中已经实现,算是back port吧。

我们来看看新的写法


    from abc import ABCMeta

    from abc import ABCMeta,abstractmethod

    class Foo():
      __metaclass__ = ABCMeta
      @abstractmethod
      def bar(self):
        pass

运行效果


    >>> class B(Foo):
    ... def bar(self):
    ... pass
    ... 
    >>> B()
    <__main__.B object at 0x02EE7B50>
    >>> B().bar()
    >>> class C(Foo):
    ... pass
    ... 
    >>> C().bar()
    Traceback (most recent call last):
     File "<interactive input>", line 1, in <module>
    TypeError: Can't instantiate abstract class C with abstract methods bar
    >>> 

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8