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 objclass 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 objclass 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.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...
随机推荐
- Xcode工程添加第三方文件的详细分析 Create folder references for any added folders(转)
在开发iOS项目的时候需要导入第三方的库文件,但是通过Xcode导入第三方源文件的时候会提示一些信息,不知所以然. 现在看到的文档都是针对Xcode3的,针对Xcode4的说明很少,现在分享出来. 官 ...
- 【高级算法】遗传算法解决3SAT问题(C++实现)
转载请注明出处:http://blog.csdn.net/zhoubin1992/article/details/46910079 1 SAT问题描写叙述 命题逻辑中合取范式 (CNF) 的可满足性问 ...
- Windows下切换盘符
方法: 直接输入盘符+引号,例如输入D:,不区分大小写. 使用cd命令,例如cd /d D: 使用cd命令有一些要注意的地方: 在同一个磁盘分区里,不需要加上\d,但是不同磁盘分区切换的时候,需要加上 ...
- 存储过程中SELECT INTO的使用
在MySQL存储过程中使用SELECT …INTO语句为变量赋值: 用来将查询返回的一行的各个列值保存到局部变量中. 要求: 查询的结果集中只能有1行. SELECT col_name[,...] I ...
- Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL
Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL >>>>>>>>>>>>> ...
- WAF Bypass数据库特性(Access探索篇)
0x01 背景 无聊,测试了一下access特性 0x02 测试 常见有5个位置即:select * from admin where id=1[位置一]union[位置二]select[位置三]1, ...
- Linux 集群架构
集群介绍 Keepalived 配置高可用集群
- vc 关于局部刷新
在绘制图像对象的时候,时刻获取其所占范围大小,并使用InvalidateRect( m_rectRefresh);刷新,但是光这样还是不行的要在onDraw()函数里获取PAINTSTRUCT结构的无 ...
- 用Copy命令合并文件
用Copy命令合并文件 这个文章是在我以前的百度空间里面发表过的,后来因为某个内分泌失调的管理员把我的空间http://hi.baidu.com/kamdy 封了! 旧事不提,还是回到主题吧,这个 ...
- Esper学习之十四:Pattern(一)
1. Pattern Atoms and Pattern operatorsPattern是通过原子事件和操作符组合在一起构成模板.原子事件有3类,操作符有4类,具体如下: 原子事件:1). 普通事件 ...