__new__def

class Color:
def init(self):
self.color=‘红色’
pass

# 在python当中e如果不重写__new__默认结构如下
def __new__(cls, *args, **kwargs):
    return super.__new__(cls, *args, **kwargs)
    #return object.__new__(cls, *args, **kwargs)
pass

c=Color()#实例化的过程会自动调用__new__ 去 创建实例
c.color
#在新式类中__new__才是真正的实例化的方法,为类提供外壳制造出实例框架,

然后调用该框架内的构造方法__init__进行丰满操作

#比喻建房子new方法负责开发地皮打地基并将原料存放在工地,而_
#init 负责从工地取材料建造出地皮开发图纸规定的大楼,
#负责细节设计、建造最终完成

`def __new__(cls, val)` 是 Python 中用于**创建类实例的一个特殊方法**,它是实例化过程的第一步。我们来详细解释它的作用、用法和原理。 --- ### ✅ 什么是 `__new__`? - `__new__` 是一个**静态方法(但不需要用 `@staticmethod` 装饰)**,负责创建并返回一个类的实例。 - 它在 `__init__` 方法之前被调用。 - 如果 `__new__` 返回了某个类的实例,则该实例会传递给 `__init__` 方法进行初始化。 - 它是实现**不可变类型自定义**、**单例模式**、**对象池**等高级功能的关键。 #### 基本语法: ```python def __new__(cls, *args, **kwargs): instance = super().__new__(cls) return instance ``` --- ### 🌰 示例:使用 `__new__` 创建对象 ```python class MyClass: def __new__(cls, val): print(f"正在创建 {cls} 的实例,值为 {val}") # 调用父类(通常是 object)的 __new__ 来真正创建实例 instance = super().__new__(cls) return instance def __init__(self, val): print(f"正在初始化实例,值为 {val}") self.val = val # 使用 obj = MyClass(10) ``` 输出: ``` 正在创建 <class '__main__.MyClass'> 的实例,值为 10 正在初始化实例,值为 10 ``` --- ### 🔁 执行流程说明 1. `MyClass(10)` 触发 `__new__` 被调用 → `cls` 是 `MyClass`,`val` 是 `10` 2. `__new__` 创建实例(通过 `super().__new__(cls)`) 3. 返回这个实例 4. 系统自动调用 `__init__(self, val)` 初始化它 --- ### ⚠️ 特殊行为:控制是否调用 `__init__` 如果你在 `__new__` 中**没有返回当前类的实例**,那么 `__init__` **不会被调用**! #### 示例:跳过 `__init__` ```python class Singleton: _instance = None def __new__(cls): if cls._instance is None: print("创建新实例") cls._instance = super().__new__(cls) else: print("复用已有实例") return cls._instance # 测试 a = Singleton() b = Singleton() print(a is b) # True —— 单例! ``` 这正是实现**单例模式**的核心技巧。 --- ### 💡 实际应用场景 | 场景 | 如何使用 `__new__` | |------|------------------| | **单例模式** | 控制只创建一次实例 | | **不可变类型扩展** | 如继承 `int`, `str`, `tuple` 时必须重写 `__new__` | | **反序列化/缓存对象** | 比如从缓存中取对象而不新建 | | **元编程 / 框架开发** | 动态控制对象生成过程 | --- ### 🧪 经典案例:继承 `int` 实现带参数的整数类型 由于 `int` 是不可变类型,我们必须在 `__new__` 中处理构造逻辑: ```python class PositiveInt(int): def __new__(cls, value): if value <= 0: raise ValueError("必须是正整数") return super().__new__(cls, value) # 使用 x = PositiveInt(5) print(x) # 5 # y = PositiveInt(-3) # 抛出异常 ``` > 注意:这里不能把值赋给 `self`,因为还没创建出来;必须由 `__new__` 返回一个有效的 `int` 实例。 --- ### ❗️注意事项 1. `__new__` 必须返回一个有效的实例对象(通常是 `cls` 的实例),否则 `__init__` 不会被调用。 2. 参数要匹配:`__new__(cls, ...)` 的参数要和 `__init__(...)` 一致(或能传递过去)。 3. 多数情况下不需要重写 `__new__`,除非你要控制对象创建过程。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值