Python 如何从模块中添加所有函数,使函数在运行时添加,而不是在创建实例时添加?
我有很多不同的函数将在特定类的实例上操作,Python 如何从模块中添加所有函数,使函数在运行时添加,而不是在创建实例时添加?,python,Python,我有很多不同的函数将在特定类的实例上操作,DSM。我希望它们既可以作为类的实例函数,也可以作为模块级的单独函数。函数当前存储在两个不同的模块中,similarity.py和compositions.py,而类存储在model.py中 因此,我可以从每个模块导入函数,并以传统的方式在类上应用函数,similarity.cos(dsm_实例,arg1,arg2),这就是我想要的。我还想让每个模块中的所有函数自动添加到类实例中,这样我就可以调用dsm_instance.cos(arg1,arg2) 因
DSM
。我希望它们既可以作为类的实例函数,也可以作为模块级的单独函数。函数当前存储在两个不同的模块中,similarity.py
和compositions.py
,而类存储在model.py
中
因此,我可以从每个模块导入函数,并以传统的方式在类上应用函数,similarity.cos(dsm_实例,arg1,arg2)
,这就是我想要的。我还想让每个模块中的所有函数自动添加到类实例中,这样我就可以调用dsm_instance.cos(arg1,arg2)
因为创建类实例需要很多时间,所以我会在创建每个实例后立即缓存它们。因此,我更希望在运行时将每个模块中的函数添加到类实例中。这是为了能够修复任何bug并向每个类实例添加新功能,而无需重新创建实例本身
总而言之:我如何自动添加特定模块中的所有函数,使函数在运行时添加,而不是在实例首次创建时添加?这感觉有点粗糙,但以下方法可以工作。我用它作为例子,只是因为它很容易获得。如果在模块中定义了
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
希望这有帮助
>>> 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']
改为将它们添加到类中?使用多重继承,在类中混合。是否最好使用单元测试来提前确保一切正常工作?@univerio:如果这样做,新函数和现有函数的修复不会在缓存类上实现。函数的数量也使得将它们分开更为可取。@jcfollower:已经在使用单元测试,但是错误仍然时不时地出现。此外,这也不能解决在初始化后向类中添加新函数的问题。这对于向类中添加函数非常有效,但不幸的是,它似乎没有作为实例方法添加。也就是说,当调用foo.bar(self)
时,self
不被认为是类本身,我必须手动添加它。你有解决这个问题的办法吗?我现在想不起来,我会考虑的。我很好奇你能想出什么来。@JimmyC,你看过帖子了吗?还有一个,我认为后者有一个解决办法。