当前位置: 首页 > 面试题库 >

等效于Python的Builder模式

洪博涛
2023-03-14
问题内容

在Java中,可以使用 构建器模式
来提供一种更具可读性的方法来实例化具有许多参数的类。在构建器模式中,一个人使用一种方法来构造配置对象以设置命名属性,然后使用它来构造另一个对象。

Python中的等效项是什么?模仿相同实现的最佳方法是吗?


问题答案:

设计模式通常可以用内置语言功能代替。

您的用例

您说:“我想有一个更具可读性的“方法”来实例化具有许多参数的类。” 在Java的情况下:

[A]构建器模式的用例是,要构建的对象的构造器必须采用很多参数时。在这种情况下,它往往是更方便的生成器对象忍下这样的配置参数(setMaxTemperature(int t)setMinTemperature(int t)set…等),而不是负担的参数一长串呼叫者在类的构造函数传递。。

不需要构建器模式

但是Python支持 命名参数
,因此这不是必需的。您可以定义一个类的构造函数:

class SomeClass(object):
    def __init__(self, foo="default foo", bar="default bar", baz="default baz"):
        # do something

并使用命名参数调用它:

s = SomeClass(bar=1, foo=0)

请注意,您可以自由地对参数进行重新排序和省略,就像Java中的构建器一样,您可以set对构建器对象上的方法的调用进行省略或重新排序。

同样值得一提的是,Python的动态特性为您提供了更多的对象构建(使用__new__等)自由,它可以替代生成器模式的其他用途。

但是如果您真的想使用它

您可以将其collections.namedtuple用作配置对象。namedtuple()返回表示元组的新类型,每个元组的参数都有给定的名称,而无需编写样板类。您可以以类似于Java构建器的方式使用结果类型的对象。(感谢Paul
McGuire
提出的建议。)

StringBuilder

一个相关的模式是Java的StringBuilder,它用于有效地String分阶段构造(不可变的)。在Python中,可以用代替str.join。例如:

final StringBuilder sb = new StringBuilder();
for(int i = 0; i < 100; i++)
    sb.append("Hello(" + i + ")");
return sb.toString();

可以替换为

return "".join("Hello({})".format(i) for i in range(100))


 类似资料:
  • 问题内容: 最近,我遇到了一些Java代码,这些代码简单地将一些字符串放入Java TreeSet中,为其实现了基于距离的比较器,然后在日落时分快乐地计算出给定的分数来解决给定的问题。 我的问题 是否有适用于Python的等效数据结构? Java树集看起来基本上是一个有序字典,可以使用某种比较器来实现这种排序。 我看到有一个用于 OrderedDict的Py3K的PEP,但是我使用的是2.6.x。

  • 问题内容: 我正在玩Go,但是我很难做其他语言中非常简单的事情。 我想重现类似的语法: 在Go中,有什么优雅的方法?我真的很想简化我的代码,尤其是在数组上使用函数时。例如: 非常感谢 问题答案: 有趣的是,Rob Pike 刚刚提出了(18小时前)库过滤器,该过滤器可以满足您的要求: 例如查看Choose() 在这里测试: 正如评论中[]指出的那样,该库的GoDoc指出: 软件包包含实用程序功能,

  • 问题内容: 当我从解释器编写Python代码时,我可以键入要在当前作用域中定义的名称列表。当我使用交互式控制台(如Firebug,Chrome控制台等)从浏览器开发Javascript代码时,如何以编程方式实现具有相同的信息? 问题答案: 在ChatZilla的代码中,有几个功能可以执行此操作,您必须正确检查许可证以查看是否可以将其撕下来并在任何地方使用。 相关功能可以在 http://hg.mo

  • 问题内容: 我正在从xml配置转移到注释。我想转换一个会话范围的bean是 可以通过注释完成此操作吗?如果没有,我该怎么做才能使该声明继续工作? 问题答案: 在spring上下文xml中,执行以下操作: 请注意,尽管如此,你将需要为该包中的所有类编写接口。

  • 问题内容: 我有一些需要在C++中模仿的示例Python代码。我不需要任何特定的解决方案(例如基于协同例程的收益解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义即可。 python 这是一个基本的序列生成器,显然太大了,无法存储实例化版本。 目标是维护上述序列的两个实例,并以半锁步的方式在块上进行迭代。在下面的示例中,使用对的序列来初始化缓冲区,然后重新生成 相同的精确序列 并再次

  • 问题内容: Java是否具有等效于Python 方法的方法? 问题答案: Guava还提供类似于Python的东西: 您也可以使用Guava的AbstractIterator实现一个相当简单的迭代器来执行相同的操作: