如何添加模块中的所有函数,使函数在运行时添加,而不是在创建实例时添加?

2024-09-25 00:26:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多不同的函数要在特定类的实例上操作,DSM。我希望它们既可以作为类的实例函数,也可以作为模块级的独立函数。函数当前存储在两个不同的模块中,similarity.pycompositions.py,而类存储在model.py。你知道吗

因此,我可以从每个模块导入函数,并以一种传统的方式将函数应用于类similarity.cos(dsm_instance, arg1, arg2),这就是我想要的。我还想让每个模块中的所有函数自动添加到类实例中,这样我就可以调用dsm_instance.cos(arg1, arg2)。你知道吗

因为创建类实例要花很多时间,所以我会在创建每个实例后立即缓存它们。因此,我更希望在运行时将每个模块中的函数添加到类实例中。这是为了能够修复任何bug并向每个类实例添加新功能,而不需要重新创建实例本身。你知道吗

总结一下:如何自动添加特定模块中的所有函数,使函数在运行时添加,而不是在创建实例时添加?你知道吗


Tags: 模块实例instance函数pymodel方式传统
1条回答
网友
1楼 · 发布于 2024-09-25 00:26:16

这感觉有点像黑客,但下面的方法会奏效。我使用scikit-bio作为例子,只是因为它是现成的。如果您在模块中定义了__all__,或者其他一些包含感兴趣的名称的变量,那么您可以导入它并动态更新后续对象。你知道吗

希望这有帮助!你知道吗

>>> class foo(object):
...   def update_namespace(self):
...     import skbio
...     reload(skbio)
...     from skbio import __all__ as namespace_to_update
...     for func in namespace_to_update:
...         setattr(self, func, getattr(skbio, func))
...
>>> bar = foo()
>>> dir(bar)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'update_namespace']
>>> bar.update_namespace()
>>> dir(bar)
['Alignment', 'BiologicalSequence', 'DNA', 'DNASequence', 'DistanceMatrix', 'FastaIterator', 'FastqIterator', 'NucleotideSequence', 'Protein', 'ProteinSequence', 'RNA', 'RNASequence', 'SequenceCollection', 'SequenceIterator', 'TreeNode', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'local_pairwise_align_ssw', 'nj', 'parse_fasta', 'parse_fastq', 'parse_qual', 'update_namespace']

相关问题 更多 >