在Python中超越工厂

chi*_*der 7 python java

从Java进入Python,我被告知工厂不是Pythonic.因此,我正在寻找一种 Python方法来执行以下操作.(我过分简化了我的目标,所以我不必描述我的整个程序,这非常复杂).

我的脚本将以人名(以及有关它们的一些信息)读取,并从中构建Person类型的对象.名称可能会重复,我只需要每个名称一个Person实例.这些人也可能属于男人和女人的子类.

一种方法是创建一个PersonFactory,它可以返回一个新实例化的Man或Woman,可以引用之前实例化的具有相同名称的Man/Woman.另一种方法是创建一组所有Person对象,并在实例化一个新对象之前每次检查是否存在具有给定名称的Person.然而,这两种方法都没有像Pythonic那样让我感到震惊.对于Python来说,第一个似乎有点过于繁琐(创建一个完整的类只是为了处理另一个对象的创建?真的吗?)而第二个会很快变得昂贵,因为我有很多名字需要处理.

Ned*_*der 12

我不认为工厂不是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...
Run Code Online (Sandbox Code Playgroud)

通常,相同的模式在Python代码中起作用,就像在Java中一样,但我们并没有做出如此大的处理.在Java中,你有一个全新的类,它意味着一个全新的.java文件,你需要使它成为单例等等.Java似乎会产生这种复杂性.一个简单的类方法就可以了,所以只需使用它.

  • 您现有的代码不适用于子类化 - 您需要使用`= cls(name)`. (2认同)
  • 我只是称它为`from_name`(所以它被称为`Person.from_name`或`SubclassOfPerson.from_name`).但除此之外最好的解决方案,+ 1 (2认同)