python中抽象工厂的基础
afb的Python项目详细描述
抽象工厂代理
简介
抽象工厂代理(afb
)是一个方便抽象工厂管理的库。它引入了一种通过抽象工厂网络将配置文件转换为python对象的机制,允许灵活地指定执行行为。
安装
此库支持Python3.3+。
$ pip install afb
机制
此软件包包含两个类:
制造商
:- 同类工厂集合。
- 经纪人:
- 制造商集合
制造商
制造商是一类工厂的集合。它负责将对象创建请求委托给指定的工厂。过程如下:
- 根据给定的密钥检索工厂以及其他信息。
- 根据工厂的签名准备工厂所需的参数。
- 调用工厂并返回结果。
每个请求都是通过调用带有参数的方法来完成的
方法
:工厂的钥匙。params
:关键字参数值的adict
。
工厂依赖于文本中不可直接表示的对象(如字符串或数字)的情况并不少见。在这种情况下,对所需对象的请求可以嵌套在当前请求中。manufacturer
首先通过broker
建立的网络将子请求传递给所需类的manufacturer
来准备参数(参见下文)。之后,调用工厂以返回所需的结果。
经纪人
代理(broker)是制造商(manufacturer)的集合,它定义了一个制造商(manufacturer)网络(manufacturer)。它包含一个类到制造商的映射,将请求传递给负责的制造商进行处理。
它还通过其make
方法接受对象创建请求,在该方法中,需要额外的cls
参数来确定要使用的正确manufacturer
。
让我们看一个例子。假设有两个类,a
和b
。a
有一个工厂fa
依赖于ab
对象和一个float
:
deffa(b,x):"""Creates an `A` object. Args: b: An instance of `B` object. x: A float. """...returnA(...)
并且b
有一个工厂fb
这取决于一个字符串:
deffb(s):"""Creates a `B` object. Args: s: String. """...returnB(...)
通过首先创建一个b
对象,可以创建a
的实例,并使用float
将其传递给fa
。
# Create a `B` objects="some string"b=fb(s)# Create an `A` objectx=3.14a=fa(b,x)
假设上述工厂在由代理定义的网络中注册到各自的制造商中(MFR A
,MFR B
),A
可以通过以下调用创建:
params={"fa":{"b":{"fb":{"s":"some string"}},"x":3.14}}a=bkr.make(cls=A,params=params)
这允许我们将对象规范导出到执行时(甚至动态生成)提供的外部配置文件中,使程序具有显著的可配置性。
基本用法
最好用一个例子来说明它是如何工作的。假设我们有以下课程:
# Class definitionsclassA(object):...classB(object):...classC(object):...
每个班级都有一个工厂,比如:
# Factoriesdeffa(x:int,y:float)->A:returnA(...)deffb(z:str,a:A)->B:returnB(...)deffc(x:float,b:B)->C:returnC(...)
注意:这里我们使用Python3.5提供的类型提示进行简单说明。在实际代码中,它们不是必需的。
现在我们有三个班,每个班有一个工厂。我们需要做的第一件事是为每个类创建一个制造商,并注册它们的工厂。
# Manufacturer for class B# ---------------------------# 1.1 Create Manufacturermfr_b=Manufacturer(B)# 1.2 Register `fb` into `mfr_b`# 1.2.1 Provide descriptions for `fa`.descriptions={"short":"Creates B from z, a.""long":"""Creates B from z, a, where ..."""}# 1.2.2 Provide signature, with descriptionssig_b={"z":{"type":str,"description":"Input mode of ..."},"a":{"type":A,"description":"Logic block A which ..."}}# 1.2.3 Register factory.# We use the key "fact_b" to refer to the factory `fb`mfr_a.register("fact_b",fb,sig_b,descriptions=descriptions)
最后,将所有 从这一点出发,可以使用 broker.make方法接受两个参数: 目标类( 对象规范可以嵌套。考虑创建一个对象 执行过程如下: 注意:以上是仅供说明之用。在实际应用中,规范通常是从配置文件中加载的,类和工厂是在专用的包和模块中定义的,并有一个用于管理的注册表。制造商注册到
代理颂歌>:< /P>
# Create a Brokerbroker=Broker()# Register Manufacturersbroker.register(mfr_a)broker.register(mfr_b)broker.register(mfr_c)# Or one can make a single function call:# `broker.register_all([mfr_a, mfr_b, mfr_c])
broker
和注册的manufacturer
s来创建对象。例如,可以通过以下方式创建a
的实例:$ pip install afb
0
cls
)用于broker
检索右边的manufacturer
,而对象speicifcation是指定:c
,它在fc
中使用fb
表示所需的b
,在fb
中使用fa
表示所需的a
:$ pip install afb
1
broker
检索c
的制造商,并调用
mfr\u c.make
mfr_c
检索由"fact_c"
,fc
键入的工厂,并为其准备参数x
和b
。fc
需要x
作为float
,并且给定的值本身就是float
,所以它将进入下一个参数。fc
要求b
作为ab
,并且给定值是单变量dict
,规范b
,它被解释为对象规范。mfr\u c
然后生成一个broker.make
调用对象实例化。代理
检索b
的制造商
,制造商b
,并用规范b
调用制造商b.make
。
mfr_b
检索由"fact_b"
,fb
键入的工厂,并为其准备参数z
和a
。z
作为str
,且给定值本身是astr
,因此它将进入下一个参数。fb
要求将a
作为a
,并且给定的值是单例的dict
,规范a
,它被解释为对象规范。mfr_b
然后生成一个broker.make
调用对象实例化。broker
检索a
的manufacturer
,mfr_a
,并用spec_a
调用mfr_a.make
mfr_a
检索由"fact_a"
,fa
键入的工厂,并为其准备参数x
和y
。x
作为int
,并且给定的值本身就是int
,所以它进入下一个参数。fa
要求y
作为浮点值
,并且给定值本身是浮点值
,为fa
进行参数准备mfr a
用准备好的x
和y
调用fa
,并将结果obj a
从fa
返回给调用方。代理
将对象a
返回给调用方。制造商b
完成参数准备。它用准备好的z
和a
调用fb
,并将结果返回给调用方。代理
将对象b
返回给调用方。mfr_c
完成参数准备。它用准备好的x
和b
调用fc
,并将结果返回给调用方。代理
将对象c
返回给调用方。推荐PyPI第三方库