小编典典

元类的一些(具体)用例是什么?

python

我有一个喜欢使用元类的朋友,并定期提供它们作为解决方案。

我认为您几乎不需要使用元类。为什么?因为我认为如果您正在对类进行此类操作,则可能应该对对象进行操作。并进行了少量的重新设计/重构。

能够使用元类已经使很多地方的许多人将类用作某种第二流的对象,这对我来说似乎是灾难性的。用元编程代替编程吗?不幸的是,添加了类装饰器后,它甚至被接受了。

所以,我很想知道您在Python中对元类的有效(具体)用例。还是要启蒙一下,为什么有时候变异类比变异对象更好。

我将开始:

有时在使用第三方库时,能够以某种方式对类进行更改很有用。

(这是我能想到的唯一情况,并不具体)


阅读 178

收藏
2020-12-20

共1个答案

小编典典

我有一个处理非交互式绘图的类,作为Matplotlib的前端。但是,有时需要进行交互式绘图。仅使用几个函数,我发现我能够增加图形数量,手动调用绘制等,但是我需要在每次绘制调用之前和之后执行这些操作。因此,要创建交互式绘图包装器和屏幕外绘图包装器,我发现通过元类包装适当的方法来执行此操作比执行以下操作更有效:

class PlottingInteractive:
    add_slice = wrap_pylab_newplot(add_slice)

这种方法不能跟上API的更改等等,但是__init__在重新设置类属性之前对类属性进行迭代的一种方法效率更高,并且可以保持最新状态:

class _Interactify(type):
    def __init__(cls, name, bases, d):
        super(_Interactify, cls).__init__(name, bases, d)
        for base in bases:
            for attrname in dir(base):
                if attrname in d: continue # If overridden, don't reset
                attr = getattr(cls, attrname)
                if type(attr) == types.MethodType:
                    if attrname.startswith("add_"):
                        setattr(cls, attrname, wrap_pylab_newplot(attr))
                    elif attrname.startswith("set_"):
                        setattr(cls, attrname, wrap_pylab_show(attr))

当然,也许有更好的方法可以做到这一点,但是我发现这是有效的。当然,这也可以在__new__或中完成__init__,但这是我发现最直接的解决方案。

2020-12-20