lc88824 发表于 2024-9-22 17:25:39

元类创建super和type区别

元类创建中new、init、call方法中type.引用和super().引用 传参都一样,为什么init和call方法中type.和super().后面参数不一样呢

FishC 发表于 2024-9-22 17:25:52

在元类创建中,`__new__` 和 `__init__` 方法中的 `type` 和 `super()` 行为有一些细微但重要的区别。简单来说:

1. **`type` 与 `super()` 的区别**:
   - `type` 是一个直接调用,用于创建类或者检查对象的类型。
   - `super()` 用于调用父类的某个方法。

2. **`__new__` 方法中**:
   - `type.__new__(cls, name, bases, dct)`:这是直接调用 `type` 本身,它创建并返回一个新的类对象。这是实际执行“创建”的地方。
   - `super().__new__(cls, name, bases, dct)`:这是调用父类的 `__new__` 方法。对于一个元类来说,它通常就是 `type.__new__`。

3. **`__init__` 方法中**:
   - `type.__init__(cls, name, bases, dct)`:调用 `type` 的 `__init__` 方法。这个一般不常见,因为初始化过程通常在 `__new__` 中完成。
   - `super().__init__(name, bases, dct)`:调用父类(通常是 `type`)的 `__init__` 方法,对已经创建的类对象进行初始化。

4. **`__call__` 方法中**:
   - `type.__call__(cls, *args, **kwargs)`:直接调用 `type` 的 `__call__` 方法,这通常是在你需要定制实例化行为时用到。
   - `super().__call__(*args, **kwargs)`:调用父类的 `__call__` 方法,实际进行实例化。

**总结**:
- `type` 的调用是直接针对具体的类型本身,而 `super()` 的调用则是针对继承链中的父类。
- `type` 接受的参数是针对类型层级的,而 `super()` 的参数是针对实例化和初始化步骤的。

这些细微的区别,主要是在不同的上下文中,如何对类进行创建、初始化和调用时,有不同的用法和语义。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

isdkz 发表于 2024-9-23 00:17:32

因为 __new__ 是静态方法,所以不管是使用 type. 和 super(). 所有参数都需要自己传进去

而 __init__ 和 __call__ 是实例方法,使用 super(). 会自动帮你传入实例对象作为第一个参数,使用 type. 则需要自己传入
页: [1]
查看完整版本: 元类创建super和type区别