Python面向对象编程核心概念总结

4 阅读1分钟

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的关系

执行顺序

newinit

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 已存在
→ 直接返回旧实例
→ 不再分配新内存