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 >>>