Python 面向对象核心总结:init / new / 单例 / 类属性
一、什么时候需要写 super().init()
1. 子类不定义 init 的情况
如果子类没有定义自己的 __init__,会自动继承父类的 init:
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
pass
s = Son("Tom") # 自动调用 Father.__init__
此时不需要手动写super().init()。
2. 子类定义 init 的情况
只要子类重写了__init__,就必须显示调用父类的init,否则父类属性就不会被初始化:
class Father:
def __init__(self, name):
self.name = name
class Son(Father):
def __init__(self, name, age):
super().__init__(name) # 必须写
self.age = age
总结
只要子类写了自己的init,并且还要用父类属性,就必须写super().init()。
二、new和init的关系
执行顺序
new → init
new:负责创建对象(分配对象的内存地址,返回实例)
init:负责初始化对象(给属性赋值)
三、类属性
class A:
x = 1
a1 = A()
a2 = A()
类属性只会创建一次,所有实例对象都是共用一个类属性
四、用new实现单例模式
class SuperC:
_instance = None # 类属性
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls) # 调用 object.__new__ 分配内存
return cls._instance
a = SuperC()
b = SuperC()
print(a is b) # True
单例执行原理
第一次
SuperC()
→ __new__
→ _instance 是 None
→ 调用 object.__new__ 创建实例
→ 保存到 cls._instance
→ 返回实例
第二次
SuperC()
→ __new__
→ _instance 已存在
→ 直接返回旧实例
→ 不再分配新内存