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

定义元类时,是否有任何理由选择__new__而不是__init__?

公冶泰
2023-03-14
问题内容

我一直在设置元类,如下所示:

class SomeMetaClass(type):
    def __new__(cls, name, bases, dict):
        #do stuff here

但是我只是遇到了这样定义的元类:

class SomeMetaClass(type):
    def __init__(self, name, bases, dict):
        #do stuff here

有什么理由比另一个更喜欢吗?

更新
:请记住,我在询问有关在类中使用__new____init__的问题。我已经在另一堂课中了解了它们之间的区别。但是在元类中,我不能__new__用来实现缓存,因为__new__仅在元类中创建类时才调用它。


问题答案:

如果要在创建类之前更改属性dict或更改基元组,则必须使用__new__。当__init__看到参数时,该类对象已经存在。另外,__new__如果要返回除所讨论类型的新创建的类以外的其他内容,则必须使用。

另一方面,在__init__运行时,该类确实存在。因此,您可以执行一些操作,例如将对刚刚创建的类的引用提供给其成员对象之一。

编辑 :更改了措辞,以使其更清楚地表明“对象”是指类对象。



 类似资料:
  • 问题内容: 我的团队没有经验丰富的JS开发人员,但是我们正在Node中编写一个库,并得到了一位真正的JS开发人员的建议:“我们应该使js更具模块化- 不会污染全局名称空间并使之更具可读性。给新来者”,并告诉我们执行以下操作: 而不是 这有什么意义(如果有)?后者不会进行IIFE范围内的任何本地声明,即使这样,它们对于模块文件也是本地的,而不是整个文件的全局程序。 尽管我已经阅读了许多关于IIFE的

  • 问题内容: 在讨论元类时,文档指出: 当然,您也可以覆盖其他类方法(或添加新方法)。例如,在元类中定义自定义方法可在调用类时允许自定义行为,例如,并非总是创建新实例。 我的问题是:假设我想在调用类时具有自定义行为,例如缓存而不是创建新对象。我可以通过重写类的方法来做到这一点。什么时候我想用它定义一个元类?这种方法带来了什么是无法实现的? 问题答案: 直接回答你的问题是:当你想要做 更多的 不仅仅是

  • 问题内容: 我在ui-router中使用Typescript。有没有人为此找到任何打字稿定义。我看了确定的打字,什么也看不见。这是我要查找的接口文件: 问题答案: 我们将此 d.ts 用于: 更新的链接,2015年5月 https://github.com/borisyankov/DefinitelyTyped/blob/master/angular-ui- router/angular-ui-

  • 当从@RestController而不是DTO返回@Entity时,是否存在任何缺陷?这样地:

  • 问题内容: 似乎抽象类意味着该类的定义不完整,因此无法实例化。 我看到了一些简单的Java代码,其中包含一个抽象类,其中定义了所有方法。然后我想知道,为什么他们将其作为抽象类而不是真实类?他们是在这样做,所以我们不能从这个抽象类实例化吗?还是从定义了所有内容的抽象类中获得其他好处? 问题答案: 即使所有方法都具有默认实现,也有可能这些实现在应用程序上下文中实际上没有 意义 。这些方法可能仅进行内部

  • 抽象基类提供的是类继承结构的公共祖先。接口描述实现类的原子级功能。两者都更有千秋,却不尽相同。接口是一种合约式的设计:实现接口的类必须提供所有期望函数的实现。抽象基类提供一组相关类的共有抽象。这是老套的,它是这样的:继承是“ is a ”的关系,接口是“ behavies like ”的关系。这些陈词滥调已经说了很久了,因为它们的结构说明了彼此的不同:基类描述的是对象是什么,接口描述的是对象的表现