元类有哪些(具体的)用例?

2024-05-23 15:44:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我认为你几乎不需要使用元类。为什么?因为我想如果你对一个类做类似的事情,你可能应该对一个对象做。一个小的重新设计/重构就可以了。

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

所以,我非常想知道Python中元类的有效(具体)用例。或者被启发为什么类的变异有时比对象的变异好。

我将开始:

Sometimes when using a third-party library it is useful to be able to mutate the class in a certain way.

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


Tags: to对象编程地方朋友装饰解决方案用例
1条回答
网友
1楼 · 发布于 2024-05-23 15:44:23

我有一个处理非交互式打印的类,作为Matplotlib的前端。然而,有时人们想做互动策划。只有几个函数,我发现我可以增加图形计数,手动调用draw等,但我需要在每次绘图调用之前和之后执行这些操作。因此,为了创建一个交互式绘图包装器和一个屏幕外绘图包装器,我发现通过元类包装适当的方法来实现这一点比执行如下操作更为有效:

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__中完成,但这是我发现的最直接的解决方案。

相关问题 更多 >