7、Python 基础系列:面向对象高级编程

发布时间:2026/10/22 7:34:34
7、Python 基础系列:面向对象高级编程
# Python基础之面向对象高级编程 [TOC] ## 前言 前面我们学习了面向对象基础类、实例、继承、方法。本篇我们深入 Python OOP 的高级特性__slots__、property、多重继承、定制类、枚举类、元类这部分是 Python 面向对象的精髓也是面试高频考点。 ## 使用 __slots__ 默认情况下Python 的实例可以动态绑定任意属性和方法非常灵活但也带来内存开销。如果我们想要限制实例能添加的属性可以使用 __slots__。 ⚠️ 注意__slots__ 定义的限制只对当前类的实例生效对子类无效除非子类也定义 __slots__此时子类允许的属性是自身 __slots__ 父类 __slots__ 的并集。 示例代码 python class Student: __slots__ (name, age) # 只允许绑定 name、age def __init__(self, name, age): self.name name self.age age s Student(小明, 18) print(s.name, s.age) # s.score 99 # 报错AttributeError无法新增 score 属性适用场景大量创建实例百万级对象减少内存占用、防止随意新增脏属性。使用 property在面向对象中我们经常需要对属性做校验。如果直接暴露属性调用方可以随意赋值如果写get、set方法又比较繁琐。property装饰器可以把一个方法变成属性调用同时提供校验逻辑。class Student: def __init__(self, name, score): self.name name self._score score property def score(self): return self._score score.setter def score(self, value): if not isinstance(value, int): raise ValueError(分数必须是整数) if value 0 or value 100: raise ValueError(分数范围 0~100) self._score value s Student(小红, 80) print(s.score) s.score 95 print(s.score) # s.score 101 # 触发校验异常property读属性xxx.setter写属性只写property不写 setter就是只读属性多重继承Python 支持一个类同时继承多个父类区别于 Java 只支持单继承。格式class 子类(父类1,父类2,父类3):多重继承常用设计模式MixInMixIn 一般是功能类只提供方法不单独实例化用来给主类附加能力。# MixIn 功能类 class RunnableMixIn: def run(self): print(我会跑) class FlyableMixIn: def fly(self): print(我会飞) # 主类 class Animal: pass class Bird(Animal, FlyableMixIn): pass class Dog(Animal, RunnableMixIn): pass b Bird() b.fly() d Dog() d.run()重点多重继承存在 MRO方法解析顺序查找方法按照__mro__顺序从左往右查找。可以通过类名.__mro__查看顺序。定制类Python 提供很多形如__xxx__的特殊方法我们重写这些方法就可以自定义类的打印、长度、迭代、运算等行为也就是定制类。常用特殊方法__str__print(对象) 时返回自定义字符串给人看__repr__交互式命令行输出给开发者看__iter____next__让对象可以用于 for 循环迭代__getitem__支持下标取值obj[0]、切片__getattr__访问不存在的属性时触发__call__对象可以像函数一样obj()调用示例class Student: def __init__(self, name): self.name name def __str__(self): return fStudent(name{self.name}) def __repr__(self): return self.__str__() def __call__(self): print(f调用了 {self.name} 对象) s Student(小李) print(s) s()使用枚举类当变量的值是有限固定集合时比如星期、性别、状态码适合使用枚举Enum相比普通常量可读性更强防止值被随意修改。from enum import Enum class Status(Enum): SUCCESS 200 FAIL 500 NOT_FOUND 404 # 使用 print(Status.SUCCESS) print(Status.SUCCESS.value) print(Status(200)) # 遍历枚举 for s in Status: print(s)如果想要枚举值唯一可以使用unique装饰器禁止重复 valuefrom enum import Enum, unique unique class Week(Enum): MON 1 TUE 2使用元类 metaclass一句话理解类也是对象创建类的东西就是元类metaclass。 默认元类是type。我们平时class A:本质就是用 type 创建 class 对象。type 三种用法type(obj)查看对象类型type(name, bases, dict)动态创建类def fn(self): print(hello) Hello type(Hello, (object,), {hello: fn}) h Hello() h.hello()自定义元类继承type重写__new__class MetaTest(type): def __new__(cls, name, bases, attrs): print(f创建类{name}) # 在这里可以拦截、修改类的属性、方法 return super().__new__(cls, name, bases, attrs) class MyClass(metaclassMetaTest): pass元类属于比较底层的魔法一般框架开发ORM、RPC框架大量使用业务代码很少手写元类。总结__slots__限制实例属性、优化内存property优雅实现属性读写和参数校验多重继承 MixIn给类附加多个能力注意 MRO 顺序定制类重写__xxx__魔术方法自定义对象行为Enum管理一组固定常量安全易读metaclass类的类动态控制类的创建过程属于高阶黑魔法。