一、核心意义与机制
1.1 构造过程原理
1.2 与 __init__ 对比
特性__new____init__方法类型静态方法实例方法返回值必须返回实例对象无返回值调用时机创建实例时首先调用在 __new__ 之后调用主要职责控制实例创建过程初始化实例属性
二、核心功能解析
2.1 核心能力
- 控制实例创建过程
- 决定是否生成新实例
- 修改实例创建逻辑
- 实现设计模式底层支持
2.2 方法签名
元类中的 参数(示例 4.1)
- class Meta(type):
- def __new__(mcs, name, bases, attrs):
- # 参数列表固定
- return super().__new__(mcs, name, bases, attrs)
复制代码 参数名类型说明mcstype元类自身(约定命名,类似 cls 代表类)namestr要创建的类名(如 "MyClass")basestuple基类列表(继承的父类)attrsdict类属性字典(包含方法、类变量等)调用逻辑
- 元类用于创建类对象(不是实例对象)
- 参数由解释器在定义类时自动传入
- 最终调用生成类对象
不可变类型子类的(示例 3.2)
样例- class ImmutableStr(str):
- def __new__(cls, value):
- return super().__new__(cls, processed_value)
复制代码 参数名类型说明clstype当前类对象(ImmutableStr)valueAny用户自定义参数(初始化输入值)调用逻辑
- 继承自不可变类型(等)
- 必须通过完成实例创建
- 调用父类()的构造方法
- 参数需匹配父类的要求(如需要传入初始化字符串)
可变类型普通类的 (示例 3.1)
样例- class Singleton:
- def __new__(cls, *args, **kwargs):
- return super().__new__(cls)
复制代码 参数名类型说明cls`当前类对象(Singleton)*argstuple位置参数(与 __init__ 共享参数)**kwargsdict关键字参数(与 __init__ 共享参数)调用逻辑
- 普通类的实例创建流程
- 调用生成实例
- 参数需与方法兼容
2.3 参数传递关系图示
2.4 核心记忆要点
元类的四个参数是固定结构
普通类第一个参数必为的参数必须与父类一致
- 元类中:
- super().__new__(mcs, name, bases, attrs)
复制代码 - 普通类中:
- super().__new__(cls[, ...])
复制代码
三、典型应用场景
3.1 单例模式实现
- class Singleton:
- _instance = None
-
- def __new__(cls, *args, **kwargs):
- if not cls._instance:
- cls._instance = super().__new__(cls)
- return cls._instance
- a = Singleton()
- b = Singleton()
- print(a is b) # True
复制代码 3.2 不可变类型扩展
- class ImmutableStr(str):
- def __new__(cls, value):
- # 预处理字符串
- processed = value.strip().upper()
- return super().__new__(cls, processed)
-
- s = ImmutableStr(" hello ")
- print(s) # "HELLO"
复制代码 3.3 对象池技术
- class ConnectionPool:
- _pool = []
- _max_size = 5
-
- def __new__(cls):
- if len(cls._pool) < cls._max_size:
- obj = super().__new__(cls)
- cls._pool.append(obj)
- return obj
- return cls._pool.pop(0)
- conn1 = ConnectionPool()
- conn2 = ConnectionPool()
复制代码 四、高级应用技巧
4.1 元类协作
- class Meta(type):
- def __new__(mcs, name, bases, attrs):
- # 添加类属性
- attrs['version'] = 1.0
- return super().__new__(mcs, name, bases, attrs)
- class MyClass(metaclass=Meta):
- pass
- print(MyClass.version) # 1.0
复制代码 4.2 参数预处理
- class SmartTuple(tuple):
- def __new__(cls, iterable):
- # 过滤非数字元素
- filtered = (x for x in iterable if isinstance(x, (int, float)))
- return super().__new__(cls, filtered)
-
- t = SmartTuple([1, 'a', 3.14, None])
- print(t) # (1, 3.14)
复制代码 五、继承体系中的使用
5.1 继承链处理
- class Base:
- def __new__(cls, *args, **kwargs):
- print(f"Creating {cls.__name__}")
- return super().__new__(cls)
- class Child(Base):
- pass
- c = Child() # 输出 "Creating Child"
复制代码 5.2 多继承处理
- class A:
- def __new__(cls, *args, **kwargs):
- print("A's __new__")
- return super().__new__(cls)
- class B:
- def __new__(cls, *args, **kwargs):
- print("B's __new__")
- return super().__new__(cls)
- class C(A, B):
- def __new__(cls, *args, **kwargs):
- return A.__new__(cls)
- obj = C() # 输出 "A's __new__"
复制代码 六、注意事项与调试
6.1 常见错误
- class ErrorCase:
- def __new__(cls):
- # 错误:忘记返回实例
- print("Creating instance") # ❌ 无返回值
-
- def __init__(self):
- print("Initializing")
- e = ErrorCase() # TypeError
复制代码 6.2 调试技巧
- class DebugClass:
- def __new__(cls, *args, **kwargs):
- print(f"__new__ args: {args}")
- instance = super().__new__(cls)
- print(f"Instance ID: {id(instance)}")
- return instance
-
- def __init__(self, value):
- print(f"__init__ value: {value}")
- d = DebugClass(42)
复制代码 七、性能优化建议
7.1 对象缓存策略
- class ExpensiveObject:
- _cache = {}
-
- def __new__(cls, config):
- key = hash(frozenset(config.items()))
- if key not in cls._cache:
- instance = super().__new__(cls)
- instance._init(config)
- cls._cache[key] = instance
- return cls._cache[key]
-
- def __init__(self, config):
- # 避免重复初始化
- self.config = config
复制代码 最佳实践总结
- 优先使用保证继承链正常
- 修改不可变类型必须使用
- 单例模式要处理好线程安全问题
- 避免在中做耗时操作
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://www.jb51.net/python/339582h4x.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |