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

标签 python factory

我使用基类构造函数作为工厂并更改此构造函数/工厂中的类以选择合适的类——这种方法是好的 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/

相关文章:

python - 带星数的聚集数索引

python - Python 中的嵌套 for 循环

scala - 如何在 Scala 中创建具有有界类型参数的自定义 Seq?

Java MVC、工厂和观察者模式结合在一起

service - AngularJS 中的非单例服务

python - 从 imutils 到 tensorflow 的视频馈送

python - 使用坐标 python 列表的广度优先搜索

python - 对段落进行 Pyparsing

ruby-on-rails - rspec 测试的 JSON 数据

javascript - 为 JavaScript 应用程序创建测试数据的最佳方式是什么?