鱼C论坛

 找回密码
 立即注册
查看: 181|回复: 2

[已解决]元类创建super和type区别

[复制链接]
发表于 2024-9-22 17:25:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
元类创建中new、init、call方法中type.引用和super().引用 传参都一样,为什么init和call方法中type.和super().后面参数不一样呢
最佳答案
2024-9-23 00:17:32
因为 __new__ 是静态方法,所以不管是使用 type. 和 super(). 所有参数都需要自己传进去

而 __init__ 和 __call__ 是实例方法,使用 super(). 会自动帮你传入实例对象作为第一个参数,使用 type. 则需要自己传入
屏幕截图 2024-09-22 172227.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-9-23 00:17:32 | 显示全部楼层    本楼为最佳答案   
因为 __new__ 是静态方法,所以不管是使用 type. 和 super(). 所有参数都需要自己传进去

而 __init__ 和 __call__ 是实例方法,使用 super(). 会自动帮你传入实例对象作为第一个参数,使用 type. 则需要自己传入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 19:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表