在阅读了有关 Python 中猴子修补类的问题的答案后,我尝试将建议的解决方案应用于以下情况。
假设我们有一个模块a.py
class A(object):
def foo(self):
print(1)
class AA(A):
pass
Run Code Online (Sandbox Code Playgroud)
让我们尝试按如下方式对其进行猴子修补。当我们猴子补丁类时它起作用A:
>>> import a
>>> class B(object):
... def foo(self):
... print(3)
...
>>> a.A = B
>>> x = a.A()
>>> x.foo()
3
Run Code Online (Sandbox Code Playgroud)
但是如果我们尝试继承的类,它就不会被修补:
>>> y = a.AA()
>>> y.foo()
1
Run Code Online (Sandbox Code Playgroud)
有什么方法可以用所有继承的类来猴子修补该类吗?
编辑
目前,对我来说最好的解决方案如下:
>>> class AB(B, a.AA):
... pass
...
>>> a.AA = AB
>>> x = a.AA()
>>> x.foo()
3
Run Code Online (Sandbox Code Playgroud)
的任何复杂结构都将被继承,并且和a.AA之间的唯一区别是方法。这样,我们就不会修改任何内部类属性(如或)。唯一剩下的缺点是我们需要为每个继承的类执行此操作。ABa.AAfoo()__base____dict__
这是最好的方法吗?
我正在使用这个GSDMM python 实现来聚类文本消息的数据集。根据初始论文, GSDMM 收敛速度快(大约 5 次迭代)。我也有收敛到一定数量的集群,但是每次迭代仍然有很多消息传递,所以很多消息仍然在改变它们的集群。
我的输出看起来像:
In stage 0: transferred 9511 clusters with 150 clusters populated
In stage 1: transferred 4974 clusters with 138 clusters populated
In stage 2: transferred 2533 clusters with 90 clusters populated
….
In stage 34: transferred 1403 clusters with 47 clusters populated
In stage 35: transferred 1410 clusters with 47 clusters populated
In stage 36: transferred 1430 clusters with 48 clusters populated
In stage 37: transferred 1463 clusters with 48 …Run Code Online (Sandbox Code Playgroud)