码迷,mamicode.com
首页 > 其他好文 > 详细

@implementer,抽象类,接口

时间:2019-07-20 00:28:53      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:nbsp   traceback   必须   类的方法   使用   temp   模块   ack   logs   

 

@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也可以,结果是一致的。

 

@implementer,抽象类,接口

标签:nbsp   traceback   必须   类的方法   使用   temp   模块   ack   logs   

原文地址:https://www.cnblogs.com/wodeboke-y/p/11216029.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!