gpt4 book ai didi

python - Python中等效的构建器模式

转载 作者:IT老高 更新时间:2023-10-28 20:37:07 25 4
gpt4 key购买 nike

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

Python 中的等价物是什么?是模仿相同实现的最佳方式吗?

最佳答案

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

您的用例

您说“我希望有一种更易读的“方法”来实例化具有许多参数的类。”。在 Java 的情况下:

[A] use case for the builder pattern is when the constructor of the object to be built must take very many parameters. In such cases, it is often more convenient to lump such configuration parameters in a builder object (setMaxTemperature(int t), setMinTemperature(int t), set.. , etc. ) than to burden the caller with a long list of arguments to pass in the class's constructor..

不需要构建器模式

但是 Python 支持 named parameters ,所以这不是必需的。你可以定义一个类的构造函数:

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(f"Hello({i})" for i in range(100))

关于python - Python中等效的构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977279/

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