当前位置: 首页 > 面试题库 >

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

南宫嘉
2023-03-14
问题内容

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

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

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

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

我将开始:

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

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


问题答案:

我有一个处理非交互式绘图的类,作为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__,但这是我发现最直接的解决方案。



 类似资料:
  • 问题内容: 我有一个喜欢使用元类的朋友,并定期提供它们作为解决方案。 我认为您几乎不需要使用元类。为什么?因为我认为如果您正在对类进行此类操作,则可能应该对对象进行操作。并进行了少量的重新设计/重构。 能够使用元类已经使很多地方的许多人将类用作某种第二流的对象,这对我来说似乎是灾难性的。用元编程代替编程吗?不幸的是,添加了类装饰器后,它甚至被接受了。 所以,我很想知道您在Python中对元类的有效

  • 本文向大家介绍行内元素有哪些?块级元素有哪些? 空(void)元素有那些?相关面试题,主要包含被问及行内元素有哪些?块级元素有哪些? 空(void)元素有那些?时的应答技巧和注意事项,需要的朋友参考一下 行内元素:a b span img input select strong 块级元素:div ul ol li dl dt dd h1 h2 h3 h4 p 等 空元素:  

  • 本文向大家介绍Kafka系统工具有哪些类型?相关面试题,主要包含被问及Kafka系统工具有哪些类型?时的应答技巧和注意事项,需要的朋友参考一下 答:系统工具有三种类型: Kafka迁移工具:它有助于将代理从一个版本迁移到另一个版本。 Mirror Maker:Mirror Maker工具有助于将一个Kafka集群的镜像提供给另一个。 消费者检查:对于指定的主题集和消费者组,它显示主题,分区,所有者

  • 本文向大家介绍常用的BUG管理工具有哪些?相关面试题,主要包含被问及常用的BUG管理工具有哪些?时的应答技巧和注意事项,需要的朋友参考一下 禅道、JIRA、Bugfree、QC

  • 本文向大家介绍行内元素有那些。块级元素有那些。空元素有哪些相关面试题,主要包含被问及行内元素有那些。块级元素有那些。空元素有哪些时的应答技巧和注意事项,需要的朋友参考一下 首先:CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,如div的display默认值为“block”,则为“块级”元素; span默认display属性值为“inline”,

  • 本文向大家介绍HTML5新增的元素有哪些?相关面试题,主要包含被问及HTML5新增的元素有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 首先html5为了更好的实践web语义化,增加了header,footer,nav,aside,section等语义化标签,在表单方面,为了增强表单,为input增加了color,emial,data ,range等类型,在存储方面,提供了sess