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

使用元类的__call__方法而不是__new__?

易阳朔
2023-03-14
问题内容

在讨论元类时,文档指出:

当然,您也可以覆盖其他类方法(或添加新方法)。例如__call__(),在元类中定义自定义方法可在调用类时允许自定义行为,例如,并非总是创建新实例。

我的问题是:假设我想在调用类时具有自定义行为,例如缓存而不是创建新对象。我可以通过重写__new__类的方法来做到这一点。什么时候我想用它定义一个元类__call__?这种方法带来了什么是无法实现的__new__


问题答案:

直接回答你的问题是:当你想要做 更多的 不仅仅是定制实例创建,或当你想分开全班 确实 从它是如何创建的。

请参阅我在Python中创建单例的答案以及相关的讨论。

有几个优点。

  1. 它使您可以将类的 工作 与如何创建的细节分开。元类和类分别负责一件事。

  2. 您可以在元类中编写一次代码,并将其用于自定义几个类的调用行为,而不必担心多重继承。

  3. 子类可以在其__new__方法中覆盖行为,但__call__在元类上甚至根本不需要调用__new__

  4. 如果有设置工作,则可以__new__在元类的方法中进行,并且仅发生一次,而不是每次调用该类时都进行。

当然,在很多情况下,__new__如果您不担心单一职责原则,那么定制也可以工作。

但是,还有其他一些用例必须在更早的时候发生,即创建类时,而不是创建实例时。当这些方法发挥作用时,就必须要有一个元类。请参阅Python中元类的(具体)用例?有很多很棒的例子。



 类似资料:
  • 问题内容: 让我们看一下这段代码: 我希望这能打印出“孩子”,但结果是“父母”。为什么Java会改为调用父类,我该怎么做才能使其在子类中调用方法? 问题答案: 不会覆盖,因为它没有相同的形式参数。一个拿走,另一个拿走。因此,运行时的多态不会被应用,并且不会导致子类方法的执行。根据Java语言规范: 如果满足以下所有条件,则在类C中声明或由类C继承的实例方法从类C中 重写 另一个在类A中声明的方法:

  • 问题内容: 这是我的情况: 逻辑很简单。“ SomeBaseClass”是我无法修改的第三方工具。我想限制其功能,并且不想允许foo(String strs [])。 问题是在SomeBaseClass内部foo(Sting str)内部调用foo(String strs [])。因此,当我调用MyClass的foo(String str)时,出现运行时异常。我该如何告诉SomeBaseClass

  • 我刚刚了解到我可以用C++20来使用VS2019并且我正在尝试利用它。我试图使以下函数使用,因为这样和将是多余的。 除了和之外,一切正常。它应该是什么?

  • 问题内容: 我需要一些有关ajax的liferay方面的帮助。现在,我正在从页面调用ajax方法来提交一些数据。 这是我正在使用的示例代码: 在我的课程中,有一种方法被此ajax调用所调用: 所以我的问题是,现在它只是通过任何ajax类的默认方法进行校准。但是如何在ajax调用中调用类的特定方法? 我是ajax的新蜜蜂。所以无论如何请引导我..... 使用以下网址调用ajax时出现以下错误 我的流

  • 本文向大家介绍浅谈python中的__init__、__new__和__call__方法,包括了浅谈python中的__init__、__new__和__call__方法的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍关于python中__init__、__new__和__call__方法的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 任何事物都有一个从

  • 我有一个抽象类,割草机,它覆盖了toString()方法。草坪拖拉机类扩展了割草机。它覆盖了toString()方法,并调用super.toString()作为方法的第一行。然后我有一个商业类,它扩展了劳恩拖拉机并覆盖了toString(),也在第一行调用super.toString()。当实例化一个商业对象(声明为割草机对象)并调用它的toString()时,我希望它打印割草机和草坪拖拉机的两个