gpt4 book ai didi

python - 在 Python 中使用基类构造函数作为工厂?

转载 作者:太空狗 更新时间:2023-10-29 21:12:33 26 4
gpt4 key购买 nike

我使用基类构造函数作为工厂并更改此构造函数/工厂中的类以选择合适的类——这种方法是好的 python 实践还是有更优雅的方法?

我尝试阅读有关元类的帮助,但没有取得太大成功。

这是我正在做的事情的例子。

class Project(object):
"Base class and factory."
def __init__(self, url):
if is_url_local(url):
self.__class__ = ProjectLocal
else:
self.__class__ = ProjectRemote
self.url = url

class ProjectLocal(Project):
def do_something(self):
# do the stuff locally in the dir pointed by self.url

class ProjectRemote(Project):
def do_something(self):
# do the stuff communicating with remote server pointed by self.url

有了这段代码,我可以通过基类 Project 创建 ProjectLocal/ProjectRemote 的实例:

project = Project('http://example.com')
project.do_something()

我知道另一种方法是使用 fabric 函数,该函数将根据 url 返回类对象,然后代码看起来类似:

def project_factory(url):
if is_url_local(url):
return ProjectLocal(url)
else:
return ProjectRemote(url)

project = project_factory(url)
project.do_something()

我的第一种方法只是品味问题还是有一些隐藏的陷阱?

最佳答案

你不应该为此需要元类。看看 __new__方法。这将允许您控制对象的创建,而不仅仅是初始化,因此返回您选择的对象。

class Project(object):
"Base class and factory."
def __new__(cls, url):
if is_url_local(url):
return super(Project, cls).__new__(ProjectLocal, url)
else:
return super(Project, cls).__new__(ProjectRemote, url)

def __init__(self, url):
self.url = url

关于python - 在 Python 中使用基类构造函数作为工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/545419/

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