python之接口
首先,我们必须明确的一点是:python里无接口类型,定义接口只是一个人为规定,在编程过程自我约束
python的类是可以写任意个方法的
定义一个接口对继承类进行约束,接口里有什么方法,继承类就必须有什么方法,接口中不能任何功能代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Interface: def f1( self ): ''' to do something :return: ''' class Something(Interface): def f1( self ): print ( 'to do something...' ) def f2( self ): print ( 'to do other..' ) |
在其他的语言里,比如Java,继承类没有重写接口方法是会报错的,而在python里不会,就是因为python没这个类型,所以只是在我们编程过程的一个规定,以I开头的类视为接口
1
2
3
4
5
6
7
8
9
|
class IOrderRepository: def fetch_one_by( self ,nid): raise Exception( '子类中必须实现该方法' ) class Something(IOrderRepository): def fet_one_by( self ,nid): print ( '查查查数据....' ) |
抽象类,抽象方法
抽象类,可以说是类和接口的混合体,既可以定义常规方法,也可以约束子类的方法(抽象方法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
import abc #抽象类 class Foo(metaclass = abc.ABCMeta): def f1( self ): print ( 'f1' ) #抽象方法 @abc .abstractmethod def f2( self ): ''' 打印f2 ''' class Bar(Foo): def f2( self ): print ( 'f2' ) def f3( self ): print ( 'f3' ) b = Bar() b.f1() b.f2() b.f3() |
依赖注入
首先我们先看一个普通的类:
1
2
3
4
5
6
|
class Foo: def __init__( self ): self .name = 'alex' def f1( self ): print ( self .name) |
首先要明确的是,在python里,一切事物皆为对象
而所有的类都是对象,默认是由type创建
创建类的执行流程:
遇到class关键词,执行type的__init__方法,创建Foo类这个对象
遇实例化对象(obj=Foo()),执行type里的__call__方法
- 在call方法里调用Foo类的__new__方法(负责创建对象)
- 执行Foo类的__init__方法(初始化)
了解其中的原理,我们就可以在__call__里面大做文章啦
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class MyType( type ): def __call__( cls , * args, * * kwargs): obj = cls .__new__( cls , * args, * * kwargs) print ( '在这里面..' ) print ( '==========================' ) print ( '来咬我呀' ) obj.__init__( * args, * * kwargs) return obj class Foo(metaclass = MyType): def __init__( self ): self .name = 'alex' f = Foo() print (f.name) |
如果要熟练应用依赖注入,我还要弄懂一个概念,那就是组合:组合的目的就是解耦,减少依赖性,原来以某个具体的值或对象传入到内部改成以参数的形式传入
比如:在实例Bar对象时,封装Foo对象,实例Foo对象封装Head对象,就用参数的形式传入到构造方法里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
class Mapper: #在字典里定义依赖注入关系 __mapper_relation = {} #类直接调用注册关系 @staticmethod def register( cls ,value): Mapper.__mapper_relation[ cls ] = value @staticmethod def exist( cls ): if cls in Mapper.__mapper_relation: return True return False @staticmethod def get_value( cls ): return Mapper.__mapper_relation[ cls ] class MyType( type ): def __call__( cls , * args, * * kwargs): obj = cls .__new__( cls , * args, * * kwargs) arg_list = list (args) if Mapper.exist( cls ): value = Mapper.get_value( cls ) arg_list.append(value) obj.__init__( * arg_list, * * kwargs) return obj class Head: def __init__( self ): self .name = 'alex' class Foo(metaclass = MyType): def __init__( self ,h): self .h = h def f1( self ): print ( self .h) class Bar(metaclass = MyType): def __init__( self ,f): self .f = f def f2( self ): print ( self .f) Mapper.register(Foo,Head()) Mapper.register(Bar,Foo()) b = Bar() print (b.f) |
python之接口的更多相关文章
- python+request接口自动化框架
python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...
- python版接口自动化测试框架源码完整版(requests + unittest)
python版接口自动化测试框架:https://gitee.com/UncleYong/my_rf [框架目录结构介绍] bin: 可执行文件,程序入口 conf: 配置文件 core: 核心文件 ...
- python编写接口初识一
python编写接口这里用到的是他一个比较轻量级的框架 flask #!/usr/bin/python # -*- coding: UTF-8 -*- import flask,json server ...
- Python Mongodb接口
Python Mongodb接口 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. 同时,MongoDB 是一个介于关系 ...
- python+requests接口自动化测试
转自https://my.oschina.net/u/3041656/blog/820023 原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测 ...
- python+requests接口自动化测试框架实例详解
python+requests接口自动化测试框架实例详解 转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...
- 初识Django —Python API接口编程入门
初识Django —Python API接口编程入门 一.WEB架构的简单介绍 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成.我们的目标是用Python语言, ...
- python的接口类的思考?
1.java怎么实现多继承的功效:https://www.cnblogs.com/Berryxiong/p/6142735.html 2.python的接口类和抽象类:https://www.cnbl ...
- python定义接口继承类
zxq547 python定义接口继承类invalid syntax解决办法 1 2 3 4 5 6 7 class s_all(metaclass=abc.ABCMeta): #python ...
- python+requests接口自动化框架
为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...
随机推荐
- Webkit内核探究【1】——Webkit简介
出处:http://www.cnblogs.com/jyli/archive/2010/01/31/1660355.html作者:李嘉昱 研究Webkit内核已经有一段时间了,在这期间我花了很多时间去 ...
- bat 变量作用域
set answer=one if true equ true ( set answer=two echo %answer% ) echo Argument is %answer% pause
- BarTender中每个标签提示手动输入的设置方法
我们知道手动输入数据进行标签打印,可以利用BarTender中的数据输入表单来实现.表单的创建有利于提示程序员,输入要打印标签的的数据.如果手动输入数据的标签较多,可以设置表单提示为每个标签提示,减去 ...
- HQS——Half Quadratic Splitting半二次方分裂
变量分裂法 变量分裂法(Variable Splitting),解决目标函数是两个函数之和的优化问题. 1)其中g是n维向量到d维向量的一个映射. 变量分裂将上式变为: 问题(2)可能比(1)更容易或 ...
- linux alias使用
安装一些软件 python redis mysql jdk,都需要添加环境变量,一个路径添加到了环境变量,就可以直接在linux控制台输入 xx命令. 否则不添加环境变量,使用xx就会提示找不到命令 ...
- Linux+Redis实战教程_Linux上安装jdk,mysql,tomcat_安装jdk
1. Linux上安装jdk,mysql,tomcat[重点] Windows 控制面板 添加/卸载程序 进行程序的安装.更新.卸载.查看 rpm命令:相当于windows的添加/卸载程序 进行程序的 ...
- SpringMVC -- 梗概--源码--贰--异常管理
附:实体类 Class : User package com.c61.entity; import java.text.SimpleDateFormat; import java.util.Date; ...
- WPF送走控件的focus方法
我们可以调用Focus()方法,让WPF控件获得焦点, 那我现在不想要焦点了, 如何把这个包袱抛出去? 可以, 恩, 没有Unfocus(), 但下面的方法也许可行(把焦点抛给另一个不知道的控件): ...
- __stdcall __cdecl 引起的程序崩溃
崩溃弹出的截图如下 看到0xC0000005, 访问冲突的问题, 九成九是内存访问违规, 比如访问了已经释放的指针, 又或者是离开函数时栈被破坏之类. 找了一下午一直没有头绪, 好在有一份可以执行的源 ...
- JavaScript之with语句
with 语句的作用是将代码的作用域设置到一个特定的对象中. with可以简化多次写同一个对象的工作, 示例: var o={name:'a',age:25,sex:'male'} var na=o. ...