超越 Python 中的工厂

2023-11-26

从 Java 转向 Python 后,我被告知工厂不是 Pythonic 的。因此,我正在寻找 a Python 方法来执行如下操作。 (我过于简化了我的目标,这样我就不必描述我的整个程序,这非常复杂)。

我的脚本将读取人名(以及有关他们的一些信息),并据此构造 Person 类型的对象。名称可能会重复,并且我只需要每个名称一个 Person 实例。这些人也可能属于“男人”和“女人”子类。

实现此目的的一种方法是创建一个 PersonFactory,它将返回一个新实例化的 Man 或 Womanor对先前实例化的同名男人/女人的引用。另一种方法是创建一组所有 Person 对象,并在实例化新对象之前每次检查是否存在具有给定名称的 Person。不过,这两种方法都没有让我觉得Pythonic。第一个对于 Python 来说似乎有点太麻烦了(创建整个类只是为了处理另一个对象的创建?真的吗?),而第二个很快就会变得昂贵,因为我有很多名称需要处理。


我不认为工厂是非Pythonic的。不过,你不需要整节课。 Java 和 Python 之间的一大区别是,在 Python 中,您可以在类之外拥有代码。所以你可能想创建一个工厂函数。或者您可以使工厂成为 Person 类上的类方法:

class Person:

    name_map = {}

    @classmethod
    def person_from_name(cls, name):
        if name not in cls.name_map:
            cls.name_map[name] = cls(name)
        return cls.name_map[name]

    def __init__(self, name):
        etc...

Python 代码中的工作模式通常与 Java 中的工作模式相同,但我们并没有把它看得那么重要。在 Java 中,您将拥有一个全新的类,这意味着一个全新的 .java 文件,并且您需要将其设置为单例,等等。Java 似乎滋生了这种复杂性。一个简单的类方法就可以了,所以只需使用它即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超越 Python 中的工厂 的相关文章

随机推荐

  • 在 Eclipse 项目中链接名为“src”的外部源文件夹

    这不是关于在 eclipse java 项目中链接源的问题 是否可以在 eclipse 中添加一个名为 src 的外部文件夹作为源文件夹 这里的问题是将外部文件夹名称保留为 src 而不是任何其他名称 为此 我尝试从标准 eclipse j
  • UIScrollview 动画取决于内容偏移量

    我正在使用水平 UIScrollView 并且我想要根据内容偏移的 x 值进行背景颜色过渡 Example UIScrollView的宽度是640px 当内容偏移量等于0px时 背景颜色必须为红色 当内容偏移量为 320 px 时 背景必须
  • VB.NET 关键字“Is”与 Object.ReferenceEquals 相同吗?

    Is the IsVB NET 关键字与 Object ReferenceEquals 相同吗 是的 是的 除非与 TypeOf 检查结合使用 引用自MSDN Is 运算符确定是否两个 对象引用指的是相同的 目的 然而 它不执行 价值比较
  • 有哪些技术可以绕过 IE 文件下载安全规则?

    Internet Explorer 使用默认设置 我通常认为这将在 Great Unwashed 的桌面上生效 似乎不喜欢在 HTTP 响应中接受附件内容的想法 如果相应的请求不是直接从用户操作发出的 就像 点击 处理程序或本机表单提交 可
  • Raku rebless 不再适用于继承类

    该线程中给出的代码不再起作用 如何在 Perl 6 中重新定义对象 这段代码是我去年写的 当时就有效了 现在它没有 class Person class Woman is Person my tom Person new my lisa W
  • 重定向到 Node.js 中的不同页面 url(不在 Express 或其他框架中)

    我想将用户从 Node js 中的一个页面重定向到另一个页面 普通 Node js 现实生活场景 注册后 example com sigup 成功注册后我想将用户重定向到登录页面 example com login if signUpSuc
  • 如何在 SignalR 2.x 单元测试框架中向模拟客户端添加组支持?

    我正在使用 Moq 为我的 SignalR 2 x 应用程序构建一个 UnitTest 框架 我目前正在通过以下方式嘲笑我的客户 var mockClients new Mock
  • 将 Xcode 7 与 iOS 10 结合使用

    我想在 iOS 10 中使用 Xcode 7 据我了解 使用 iOS 10 beta 需要 Xcode 8 beta 所以我应该升级我的 Xcode 但是 我的代码无法由新编译器构建 因此我想继续使用 Xcode 7 我怎样才能做到这一点
  • 如何使用 Hibernate 注释在连接表上创建索引?

    我使用 Hibernate 注释有如下关系 这是我尝试过的 public class Job OneToMany cascade CascadeType ALL JoinTable name jobs resource locations
  • 使用 pandas read_csv 时出现内存错误

    我正在尝试做一些相当简单的事情 将一个大的 csv 文件读入 pandas 数据帧 data pandas read csv filepath header 0 sep DELIMITER skiprows 2 该代码要么失败 并显示Mem
  • 最小成本流 - R 中的网络优化

    我正在尝试实施一个 最低成本网络流量 交通问题解决方案R 我知道这可以使用类似的东西从头开始实现lpSolve 不过我发现有一个方便的igraph实施 最大流量 这样一个预先存在的解决方案会方便很多 但我找不到最小成本的等效函数 有没有一个
  • 如何让 JTable 标题显示整个列名而不是缩短它们?

    我有一个 JTable 其中填充了一个扩展 AbstractTableModel 的类 问题是列太短而无法显示列名称 我已经关闭了 Jtable AutoResizeMode 属性 但缩短仍然发生 我该如何解决这个问题 您可以使用桌柱调节器
  • 从 Bash 目录中读取文件名

    我需要编写一个脚本 从目录中读取所有文件名 然后根据文件名 例如 如果它包含 R1 或 R2 它将连接所有包含的文件名 例如名称中的 R1 谁能给我一些如何做到这一点的提示 我唯一能做的就是 bin bash FILES path to t
  • 使用 boto3 列出具有特定应用程序标签的自动缩放组名称

    我试图获取应用程序标记值为 CCC 的自动缩放组 名单如下 gweb prd dcc eap w2 gweb prd dcc emc gweb prd dcc ems CCC dev ccc wer CCC dev ccc gbg CCC
  • Facebook Graph API 覆盖显式设置的隐私设置

    我在为我的应用程序代表用户创建的帖子设置隐私时遇到问题 问题是 所有帖子的隐私值都被 Graph API 设置为 ALL FRIENDS 即使我明确将隐私值设置为 EVERYONE 这是我用来提交的代码 query message urle
  • iOS启动后台线程

    我的 iOS 设备中有一个小型 sqlitedb 当用户按下按钮时 我从 sqlite 获取数据并将其显示给用户 我想在后台线程中执行此获取部分 以免阻塞 UI 主线程 我这样做 self performSelectorInBackgrou
  • 具有本地作用域的 PHP 常量

    在 PHP 中是否可以有局部作用域的常量 是的 请提供一个小例子 是的 但只使用一个类 class Foo const BAR hello world print Foo BAR 关于 Kalium 的评论 如果你使用 PHP 5 3 你确
  • 何时使用 URL/会话/cookie 变量?

    我做了很多 php 和 javascript 但我认为这是一个相对与语言无关的问题 是否有关于何时使用以下各项的最佳实践 网址变量 会话变量 cookies 我了解其中一些的固有局限性can t确实如此 但似乎它们的用途有时也可以重叠 并且
  • C++11 中的动态对齐内存分配

    posix memalign and aligned malloc在 Windows 上允许动态分配对齐的内存块 C 11中有类似的东西吗 据我所知 alignas关键字仅适用于静态分配的对象 这取决于您需要什么对齐方式 对于任何 alig
  • 超越 Python 中的工厂

    从 Java 转向 Python 后 我被告知工厂不是 Pythonic 的 因此 我正在寻找 a Python 方法来执行如下操作 我过于简化了我的目标 这样我就不必描述我的整个程序 这非常复杂 我的脚本将读取人名 以及有关他们的一些信息