Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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 - Fatal编程技术网

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,你看过帖子了吗?还有一个,我认为后者有一个解决办法。