从函数创建Python对象
我的问题可能更多地与OOP有关,而不是与python有关。我写了一个类来描述一个分子,然后写了一个函数来从一个特定的文件格式创建一个分子对象:从函数创建Python对象,python,oop,Python,Oop,我的问题可能更多地与OOP有关,而不是与python有关。我写了一个类来描述一个分子,然后写了一个函数来从一个特定的文件格式创建一个分子对象:fromFILE。因此,例如,当我使用我的类时,我会执行以下操作: import mymodule mol = mymodule.fromFILE("toto") mol.method() ... 我的问题是什么是组织事情的好方法。函数fromFILE()是否应该是类的一部分?如果是,那么编写此函数的最佳方法是什么 到目前为止,我只是将类和可用于创建此类
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')
将这个工厂与类本身整齐地分组
OP甚至可以做
fromFile=molecular.fromFile
,在类和模块级别上提供该功能。这让我感到非常震撼,最重要的是单一责任。分子应该只关心分子的事情,而不是加载。我甚至认为OO在这里没有问题,构造函数应该在对象上,是吗?@Mgetz:Pythondatetime
库就是这样做的;它将构造函数与它们构造的对象类型分组datetime.fromtimestamp()
、date.today()
等都是构造各自类型的类方法。@MartijnPieters构造函数是,因为它们应该包含业务逻辑。然而,在这种情况下,我不认为文件IO与业务逻辑有密切关系。我可以看到在分子上有一个类似于molecular.react()
或molecular.decompose()
的构造器,这反过来会创建新的molecular
从\u文件中调用。camelCase是非音速的。
import repositories
mol = repositories.MoleculeRepository.FromFile('toto')