小编Ily*_*hev的帖子

Python 中使用继承类对类进行猴子修补

在阅读了有关 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__

这是最好的方法吗?

python inheritance monkeypatching

7
推荐指数
1
解决办法
2031
查看次数

GSDMM 聚类的收敛(短文本聚类)

我正在使用这个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)

python cluster-analysis topic-modeling convergence

6
推荐指数
1
解决办法
703
查看次数