第一部分:基础入门(必会)
1. 什么是面向对象(OOP)?
- 把数据和操作数据的方法封装成对象
- 核心思想:封装、继承、多态
- 优点:易复用、易扩展、易维护
2. 类和对象
- 类(class) :模板,定义属性和方法
- 对象(object) :类的实例
class Person:
def __init__(self, name):
self.name = name
p = Person("小明")
3. 构造方法 __init__
- 创建对象时自动调用
- 用于给对象初始化属性
def __init__(self, name, age):
self.name = name
self.age = age
4. self 是什么?
- 代表当前对象自己
- 哪个对象调用方法,self 就是谁
- 必须是方法的第一个参数
第二部分:三大特性(核心)
一、封装
概念
- 隐藏实现细节,对外提供公共接口
- 保护数据安全,防止随意修改
实现
- 公有:直接写
- 私有:双下划线
__ 开头
class Student:
def __init__(self, name):
self.__name = name # 私有属性
def get_name(self): # 公共接口
return self.__name
面试题
- Python 中如何实现封装? 答:使用双下划线
__ 定义私有属性/方法,外部无法直接访问,通过get/set方法访问。 - 单下划线、双下划线、前后双下划线区别? 答:
-
_xxx:约定私有,提醒不要随意访问 -
__xxx:真正私有,名称改写,外部无法访问 -
__xxx__:内置魔法方法,如 __init__、__str__
二、继承
概念
- 子类继承父类,复用属性和方法
- 子类可以重写父类方法
class Animal:
def speak(self):
print("动物叫")
class Dog(Animal):
def speak(self):
print("汪汪汪")
多继承
class A: pass
class B: pass
class C(A, B): pass
方法重写(override)
子类方法与父类同名、同参,优先执行子类。
super()
调用父类方法:
super().speak()
面试题
- Python 支持多继承吗? 答:支持。多继承会按MRO 顺序查找方法。
- 什么是方法重写?为什么要用? 答:子类重新实现父类同名方法,用于扩展或改变父类功能。
- super() 的作用? 答:调用父类的方法,避免硬编码,支持多继承。
三、多态
概念
- 同一种方法调用,不同对象表现不同行为
- 基于:继承 + 方法重写
def func(animal):
animal.speak()
func(Dog())
func(Cat())
面试题
- Python 多态的特点? 答:Python 是鸭子类型,不强制继承,只要有同名方法就可以多态。
- 多态的好处? 答:提高代码灵活性、扩展性,统一调用规范。
第三部分:高级特性(精通)
1. property 装饰器
把方法变成属性访问:
class Student:
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
self.__name = value
2. 静态方法 & 类方法
- 实例方法:默认带 self
- 类方法
@classmethod:带 cls,操作类属性 - 静态方法
@staticmethod:无 self/cls,普通工具方法
@classmethod
def cls_func(cls):
pass
@staticmethod
def static_func():
pass
3. 魔法方法
常用:
-
__init__:构造 -
__str__:打印对象 -
__repr__:解释器显示 -
__del__:析构 -
__len__:支持 len() -
__call__:对象可调用
4. 单例模式
确保一个类只有一个实例:
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
第四部分:高频面试题 + 标准答案
1. 面向对象三大特性是什么?各自作用?
答:
- 封装:隐藏细节,保护数据
- 继承:代码复用,减少冗余
- 多态:统一接口,不同实现,提高灵活度
2. 实例方法、类方法、静态方法区别?
答:
- 实例方法:操作对象,有 self
- 类方法:操作类,有 cls,用
@classmethod - 静态方法:无关联,工具方法,用
@staticmethod
3. 私有属性真的不能访问吗?如何访问?
答:可以通过名称改写访问: obj._类名__属性 但不推荐,破坏封装。
4. 什么是 MRO?如何查看?
答:方法解析顺序,多继承时决定查找顺序。 查看:类名.__mro__
5. __new__ 和 __init__ 区别?
答:
-
__new__:创建对象,分配内存 -
__init__:初始化对象属性 - 先 new,后 init
6. 什么是鸭子类型?
答: 不关注类型,只关注行为。 只要有该方法,就可以传入使用,是 Python 多态的核心。
7. 如何理解“一切皆对象”?
答:Python 中数字、字符串、函数、类、模块都是对象,都有属性和方法。
8. 多继承的经典问题是什么?
答:钻石继承问题,通过 C3 线性化算法(MRO)解决。
第五部分:综合实战题
题目
实现:
- 父类:Person
- 子类:Student、Teacher
- 封装私有属性
- 重写方法
- 体现多态
答案
class Person:
def __init__(self, name):
self.__name = name
def work(self):
pass
class Student(Person):
def work(self):
print("学习")
class Teacher(Person):
def work(self):
print("教书")
def do_work(p):
p.work()
do_work(Student("小明"))
do_work(Teacher("李老师"))