@implementer,抽象类,接口
@implementer,抽象类,接口
1. implementer
在看twisted源码时,经常出现@implementer(IReactorFDSet)
它来自zope.interface,提供了接口的实现。
理论上,它要提供一个约束要求子类必需实现装饰器中类的方法。
然而,但是,跑了一下,发现这个实现是不完全的,即便子类没有重写接口的方法,也不会报错。
# zope implementer装饰器使用
from zope.interface import Interface
from zope.interface.declarations import implementer
# 定义接口
class MyMiss(Interface):
def imissyouatlost(self,miss):
"""Say
i miss you at lost to miss"""
@implementer(MyMiss) # 继承接口
class Miss:
def imissyouatlostx(self,somebody):
"""Say
i miss you at lost to somebody"""
return "i
miss you at lost, %s!" % somebody
if __name__ == '__main__':
z = Miss()
hi = z.imissyouatlostx('Zy')
print(hi)
输出:没有异常。
它提供了两个函数implementedBy和providedBy来检测子类是否重写了接口的方法。
好像也没有什么用。
暂时不管它
参考文档:
https://www.cnblogs.com/imyalost/p/8598343.html
https://blog.csdn.net/vinrex/article/details/38118547
https://www.cnblogs.com/bjdxy/p/3182142.html
2. 抽象类
抽象类基于类抽象而来,主要用于被继承,约束子类实现抽象方法,实现归一化设计。一般不实例化抽象类。
在面向对象编程语言中,大多提供了接口(interface)的概念。接口在编程语言中指的是一个抽象类型,是抽象方法的集合;它的特点如下:
1、类通过继承接口的方式,来继承接口的抽象方法;
2、接口并不是类(虽然编写类和方法的方式很相似);
3、类描述对象的属性和方法(实现接口的类,必须实现接口内所描述的所有方法,否则必须声明为抽象类);
4、接口包含类要实现的方法(接口无法被实例化,但可以被实现);
总结:接口只定义规范,不负责具体实现(具体实现由具体的实现者完成)!
2.1. 使用abc模块实现抽象类。
import abc
class A(metaclass=abc.ABCMeta): # 指定元类
@abc.abstractmethod # 定义抽象方法,无需实现功能
def abstract_method(self):
"""子类必须定义该方法"""
pass
# class B(A):
# pass
# b=B() #TypeError: Can't instantiate abstract class Txt with abstract methods
class B(A): # 子类继承抽象类,必须定义抽象方法
def abstract_methodx(self):
print('抽象方法')
b = B()
b.abstract_method() # 抽象方法
这里使用了装饰器@abc.abstractmethod
它的作用是检查被装饰类中必需实现给定的方法。
在这里的效果是类B中必需实现A中的方法,否则会抛出异常TypeError。
Traceback (most recent call last):
File "E:/python/code test/temp.py", line 65, in <module>
b = B()
TypeError: Can't instantiate abstract class B with abstract methods abstract_method
注意,上例中在B类的方法后添加了一个X,方法名不一样了。
当然,直接pass也可以,结果是一致的。