gpt4 book ai didi

python - Python中的类工厂

转载 作者:IT老高 更新时间:2023-10-28 21:42:28 28 4
gpt4 key购买 nike

我是 Python 新手,需要一些建议来实现以下场景。

我有两个类(class)用于在两个不同的注册商处管理域。两者都有相同的界面,例如

class RegistrarA(Object):
def __init__(self, domain):
self.domain = domain

def lookup(self):
...

def register(self, info):
...

class RegistrarB(object):
def __init__(self, domain):
self.domain = domain

def lookup(self):
...

def register(self, info):
...

我想创建一个域类,给定一个域名,根据扩展名加载正确的注册商类,例如

com = Domain('test.com') #load RegistrarA
com.lookup()

biz = Domain('test.biz') #load RegistrarB
biz.lookup()

我知道这可以使用工厂函数来完成(见下文),但这是最好的方法还是使用 OOP 功能有更好的方法?

def factory(domain):
if ...:
return RegistrarA(domain)
else:
return RegistrarB(domain)

最佳答案

我认为使用函数很好。

更有趣的问题是如何确定要加载哪个注册商?一种选择是有一个抽象的基础注册器类,它具体实现子类,然后迭代它的 __subclasses__() 调用 is_registrar_for() 类方法:

class Registrar(object):
def __init__(self, domain):
self.domain = domain

class RegistrarA(Registrar):
@classmethod
def is_registrar_for(cls, domain):
return domain == 'foo.com'

class RegistrarB(Registrar):
@classmethod
def is_registrar_for(cls, domain):
return domain == 'bar.com'


def Domain(domain):
for cls in Registrar.__subclasses__():
if cls.is_registrar_for(domain):
return cls(domain)
raise ValueError


print Domain('foo.com')
print Domain('bar.com')

这将让您透明地添加新的 Registrar,并将每个支持哪些域的决定委托(delegate)给他们。

关于python - Python中的类工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/456672/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com