@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,抽象类,接口的更多相关文章

  1. 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait

    [源码下载] 速战速决 (4) - PHP: 类基础, 抽象类, 接口, trait 作者:webabcd 介绍速战速决 之 PHP 类基础 抽象类 接口 trait 示例1.类的相关知识点 1(基础 ...

  2. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  3. python面向对象 : 抽象类(接口类),多态,封装(私有制封装)

    一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...

  4. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  5. “全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. 面向对象 继承 抽象类 接口 static 权限修饰符

    Day01 面向对象 继承 抽象类 接口 static 1.匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. 2.类的继承是指在一个现有类的基础上去构建一个新的类,构建出 ...

  7. python day - 19 抽象类 接口类 多态 封装

    一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...

  8. C# 你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )

    你什么让程序员寂寞成酱紫 (男生版 娱乐中学习 抽象类 接口 继承 实现方法 )   一个家庭 相当于 一个空间,这个空间里 有 很多元素,比如 爱,爱这个抽象事物,可能有很多动作,接吻.交流,对于一 ...

  9. 13. 抽象类 & 接口

    一.抽象类 // 抽象类Shape public abstract class Shape { // 1. 成员变量 private String color; // 2. 初始化块 { System ...

  10. 面向对象的理解 抽象类&接口

    一.关于面向对象 1.什么是面向对象     在解释面向对象之前,先说说面向过程.学过C的同学都知道,C就是面向过程的一种语言.那什么是面向过程呢?比方说组装主机,对于面向过程,需要从0开始.买cpu ...

随机推荐

  1. Nexus坑人系列-interface Unknown state L3 Not Ready

    这个情况也容易出现在新使用设备的时候,当设备上没有L3接口模块的时候,这个问题就出现了. 接下来,尤其是如果我们需要运行VPC(并且如果正在运行N5K,N7K等!),则需要在交换机上配置第3层接口. ...

  2. angular 输入框自动绑定值最长为16位,超过16位则会报错

    最近发现angular在使用input输入框的ng-model绑定scope变量的时候,发现,输入长串的数字将会出错.代码如下: <html> <head> <meta ...

  3. 040_字符串连接符 041_条件运算符目 042_运算符优先级_逻辑与或优先问题 043_自动类型转化 044_强制类型转换 045_基本类型常见错误_溢出_L问题

    040_字符串连接符 package test_package; /** * 字符串运算符 * @author * */public class TestOperator05 { public sta ...

  4. linux shell 正则表达式详解

    正则 1. 普通正则表达式 2. 扩展正则表达式 普通正则表达式 . 任意一个字符 * 前面一个字符出现0次或者多次 [abc] 中括号内任意一个字符 [^abc] 非括号内任意一个字符 [0-9] ...

  5. FILES源代码

     FILESの源码 #include <bits/stdc++.h> #include <game.h> #define pause getchar(); #define c ...

  6. CentOS7中Tomcat的安装和配置以及启动配置tomcat。启动过程中的易错点

    Tomcat运行需要设置JRE目录,全局变量配置,请参见: Linux下JDK的安装和配置   当然也可以直接修改Tomcat的配置文件,请自行度娘   1.下载并解压 请先去官网找到需要下载的tom ...

  7. centos7下Maven Java selenium3环境搭建

    centos7下Maven Java selenium3环境搭建 一.Jdk安装 我这里用的是open-jdk. [adawang@localhost src]$ sudo yum search op ...

  8. Foreach报错

    List<String> a = new ArrayList<String>(); 2 a.add("1"); 3 a.add("2") ...

  9. svn怎么修改用户名和密码

    链接:https://blog.csdn.net/qq_36826506/article/details/80915431

  10. Android学习04

    Toast Toast是Android系统提供的一种非常好的提示方式,在程序中可以使用它将一些短小的信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何的屏幕空间. 1.默认Toast 在 ...