Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从函数创建Python对象_Python_Oop - Fatal编程技术网

从函数创建Python对象

从函数创建Python对象,python,oop,Python,Oop,我的问题可能更多地与OOP有关,而不是与python有关。我写了一个类来描述一个分子,然后写了一个函数来从一个特定的文件格式创建一个分子对象:fromFILE。因此,例如,当我使用我的类时,我会执行以下操作: import mymodule mol = mymodule.fromFILE("toto") mol.method() ... 我的问题是什么是组织事情的好方法。函数fromFILE()是否应该是类的一部分?如果是,那么编写此函数的最佳方法是什么 到目前为止,我只是将类和可用于创建此类

我的问题可能更多地与OOP有关,而不是与python有关。我写了一个类来描述一个分子,然后写了一个函数来从一个特定的文件格式创建一个分子对象:
fromFILE
。因此,例如,当我使用我的类时,我会执行以下操作:

import mymodule
mol = mymodule.fromFILE("toto")
mol.method()
...
我的问题是什么是组织事情的好方法。函数fromFILE()是否应该是类的一部分?如果是,那么编写此函数的最佳方法是什么


到目前为止,我只是将类和可用于创建此类的函数放在同一个模块中,但我不知道这是否是最好的方法。

您可以将其作为类方法:

class Molecule(object):
    # ...

    @classmethod
    def fromFile(cls, filename):
        data = # ... parse data from filename ...
        return cls(data)
这还有一个额外的优点,子类可以简单地继承它,或者重写它来调整方法的功能(包括调用原始父实现)。它提供了一个替代类工厂:

import mymodule

mol = mymodule.Molecule.fromFile('toto')
将这个工厂与类本身整齐地分组

  • 你的分子行为是否与文件IO有关?可能不是,这表明该分子是一个实体,应该被忽略。同时,它需要实施自己的业务逻辑
  • 构建分子本身所需的信息是业务逻辑吗?如果是这样,那么您可能需要考虑使用存储库模式或工厂模式,或者两者的组合(我将做什么)
  • 。 例:


    OP甚至可以做
    fromFile=molecular.fromFile
    ,在类和模块级别上提供该功能。这让我感到非常震撼,最重要的是单一责任。分子应该只关心分子的事情,而不是加载。我甚至认为OO在这里没有问题,构造函数应该在对象上,是吗?@Mgetz:Python
    datetime
    库就是这样做的;它将构造函数与它们构造的对象类型分组
    datetime.fromtimestamp()
    date.today()
    等都是构造各自类型的类方法。@MartijnPieters构造函数是,因为它们应该包含业务逻辑。然而,在这种情况下,我不认为文件IO与业务逻辑有密切关系。我可以看到在分子上有一个类似于
    molecular.react()
    molecular.decompose()
    的构造器,这反过来会创建新的
    molecular
    从\u文件中调用
    。camelCase是非音速的。
    
    import repositories
    mol = repositories.MoleculeRepository.FromFile('toto')