Python抽象类的新写法
记得之前learnpython一书里面,因为当时没有官方支持,只能通过hack的方式实现抽象方法,具体如下最简单的写法
classMyCls(): deffoo(self): print('methodnoimplement') 运行的例子 >>>a=MyCls() >>>a.foo() methodnoimplement >>>
这样虽然可以用,但是提示不明显,还是容易误用,当然,还有更好的方法较为可以接受的写法
classMyCls(): deffoo(self): raiseException('noimplementexception','foomethodneedimplement')
一个简单的用例
>>>a=MyCls() >>>a.foo() Traceback(mostrecentcalllast): File"<interactiveinput>",line1,in<module> File"<clipboard>",line3,infoo Exception:('noimplementexception','foomethodneedimplement')
这就是2.7之前的写法了,2.7给了我们新的支持方法!abc模块(abstructbaseclass),这个在py3k中已经实现,算是backport吧。
我们来看看新的写法
fromabcimportABCMeta fromabcimportABCMeta,abstractmethod classFoo(): __metaclass__=ABCMeta @abstractmethod defbar(self): pass
运行效果
>>>classB(Foo): ...defbar(self): ...pass ... >>>B() <__main__.Bobjectat0x02EE7B50> >>>B().bar() >>>classC(Foo): ...pass ... >>>C().bar() Traceback(mostrecentcalllast): File"<interactiveinput>",line1,in<module> TypeError:Can'tinstantiateabstractclassCwithabstractmethodsbar >>>