Python 面向对象高级核心知识点(超详细完整版)

一、前言(面向对象高级是什么?)

如果你已经学会:

  • 类和对象
  • __init__ 构造方法
  • self
  • 封装、继承、多态

那面向对象高级就是在此基础上,让你真正写出专业、优雅、可维护的面向对象代码。

本篇包含:

  1. 类属性、实例属性、类方法、静态方法
  2. 魔术方法(__str__、__repr__、__del__、__len__ 等)
  3. 单例模式
  4. property 装饰器(优雅封装)
  5. 私有属性真正原理
  6. 方法重写与 super() 深度理解
  7. 多继承与 MRO 机制
  8. 面向对象设计思想

全程通俗 + 代码 + 逐行解释。


二、类属性 vs 实例属性(超级重要)

1. 实例属性

每个对象自己的属性,互不干扰。
定义位置:__init__ 里,self.xxx

class Student:
    def __init__(self, name):
        self.name = name  # 实例属性

s1 = Student("小明")
s2 = Student("小红")
print(s1.name)  # 小明
print(s2.name)  # 小红

2. 类属性

属于类本身,所有对象共享同一个值。
定义位置:类内部、方法外部。

class Student:
    school = "第一中学"  # 类属性

    def __init__(self, name):
        self.name = name

s1 = Student("小明")
s2 = Student("小红")

print(Student.school)  # 第一中学
print(s1.school)       # 第一中学
print(s2.school)       # 第一中学

重点总结

  • 实例属性:每个对象独有
  • 类属性:所有对象共享
  • 修改类属性:类名.属性 = 新值

三、三种方法:实例方法、类方法、静态方法

1. 实例方法(最常用)

  • 第一个参数必须是 self
  • 能访问:实例属性 + 类属性
class Student:
    def study(self):
        print("我在学习")

2. 类方法 @classmethod

  • 第一个参数是 cls(代表类本身)
  • 用来操作类属性
  • 不需要创建对象就能调用
class Student:
    school = "第一中学"

    @classmethod
    def set_school(cls, new_school):
        cls.school = new_school  # 修改类属性

# 直接用类调用
Student.set_school("第二中学")
print(Student.school)  # 第二中学

3. 静态方法 @staticmethod

  • 不需要 self、cls
  • 和类、对象无关,只是放在类里的工具函数
  • 不访问任何属性
class Math:
    @staticmethod
    def add(a, b):
        return a + b

print(Math.add(1,2))  # 3

快速区分(面试必问)

方法类型 装饰器 第一个参数 作用
实例方法 无 self 访问实例属性
类方法 @classmethod cls 访问/修改类属性
静态方法 @staticmethod 无 工具函数

四、魔术方法(魔法方法)深度讲解

魔术方法:__xxx__ 格式,Python 自动调用。

1. init 构造方法

创建对象时自动执行。

def __init__(self, name):
    self.name = name

2. str 打印对象时显示

不写 __str__,打印对象会显示内存地址。
写了 __str__,可以自定义输出。

class Student:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"学生对象:{self.name}"

s = Student("小明")
print(s)  # 学生对象:小明

3. repr 开发者调试显示

给程序员看的字符串。

def __repr__(self):
    return f"Student({self.name})"

4. del 析构方法

对象被销毁时自动执行。

def __del__(self):
    print("对象被销毁了")

5. len 让对象支持 len()

class MyList:
    def __len__(self):
        return 100

m = MyList()
print(len(m))  # 100

6. call 让对象可以像函数一样调用

class Test:
    def __call__(self):
        print("对象被调用啦")

t = Test()
t()  # 对象被调用啦

五、@property 装饰器(高级封装)

作用:
把方法变成属性调用,代码更优雅。

普通写法(不优雅)

class Student:
    def __init__(self, age):
        self.__age = age

    def get_age(self):
        return self.__age

    def set_age(self, age):
        if age > 0:
            self.__age = age

@property 写法(优雅、专业)

class Student:
    def __init__(self, age):
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, age):
        if age > 0:
            self.__age = age

s = Student(18)
print(s.age)   # 像属性一样获取
s.age = 20     # 像属性一样设置

优点

  • 安全封装
  • 外部使用简单
  • 代码更优雅

六、私有属性深度理解(__xxx)

Python 没有真正私有,只有名字改写(Name Mangling)。

class Student:
    def __init__(self):
        self.__age = 18

s = Student()
# print(s.__age)  # 报错
print(s._Student__age)  # 18 可以访问!

结论:
Python 的私有是君子约定,不是强制锁死。


七、super() 深度理解

super() 不是找父类,而是按照 MRO 顺序找下一个类。

基础用法

class Person:
    def __init__(self, name):
        self.name = name

class Student(Person):
    def __init__(self, name, score):
        super().__init__(name)
        self.score = score

作用

  1. 调用父类构造方法
  2. 调用父类被重写的方法
  3. 多继承下安全调用

八、多继承与 MRO 顺序

Python 支持一个类继承多个父类。

class A: pass
class B: pass
class C(A, B): pass

查看继承顺序:

print(C.__mro__)

MRO = Method Resolution Order
方法解析顺序,决定调用哪个父类的方法。


九、单例模式(高级必学)

一个类只能创建一个对象。

应用:日志、数据库连接、配置文件。

最简单单例(使用 new)

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # True 同一个对象

十、方法重写(Override)

子类写一个和父类名字相同的方法,覆盖父类逻辑。

class Animal:
    def speak(self):
        print("动物叫")

class Dog(Animal):
    def speak(self):
        print("汪汪汪")  # 重写

十一、面向对象高级总结

你真正学会了什么?

  1. 分清实例属性、类属性
  2. 分清实例方法、类方法、静态方法
  3. 会用魔术方法让对象更强大
  4. 能用@property写出优雅封装
  5. 理解私有属性本质
  6. 掌握super() 正确用法
  7. 理解多继承与MRO
  8. 会写单例模式
  9. 真正理解面向对象设计思想

一句话总结

面向对象高级 = 更安全 + 更优雅 + 更强大 + 更专业的代码写法。

posted @ 2026-04-04 08:27  Petula  阅读(137)  评论(0)    收藏  举报