Python 面向对象从入门到精通全套笔记面试题 + 标准答案

4 阅读4分钟

第一部分:基础入门(必会)

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

面试题

  1. Python 中如何实现封装? 答:使用双下划线 __ ​ 定义私有属性/方法,外部无法直接访问,通过 get/set 方法访问。
  2. 单下划线、双下划线、前后双下划线区别? 答:
  • ​_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()

面试题

  1. Python 支持多继承吗? 答:支持。多继承会按MRO 顺序查找方法。
  2. 什么是方法重写?为什么要用? 答:子类重新实现父类同名方法,用于扩展或改变父类功能。
  3. super() 的作用? 答:调用父类的方法,避免硬编码,支持多继承。

三、多态

概念

  • 同一种方法调用,不同对象表现不同行为
  • 基于:继承 + 方法重写
def func(animal):
    animal.speak()

func(Dog())
func(Cat())

面试题

  1. Python 多态的特点? 答:Python 是鸭子类型,不强制继承,只要有同名方法就可以多态。
  2. 多态的好处? 答:提高代码灵活性、扩展性,统一调用规范。

第三部分:高级特性(精通)

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("李老师"))