高频 Python 面试题解析(四)

高频 Python 面试题解析(四)

引言

Python 作为一门广泛应用的编程语言,在面试中经常涉及各种高级特性,如装饰器、元类、协程等。本篇文章继续为大家整理高频 Python 面试题,并配有详细代码示例和解析,助你更好地备战面试。


1. Python 装饰器(Decorator)

问题:什么是 Python 装饰器?如何使用?

装饰器是一种用于修改函数或类行为的高阶函数,常用于日志记录、权限校验、缓存等场景。

代码示例(函数装饰器)

def decorator(func): def wrapper(*args, **kwargs): print("函数执行前的操作") result = func(*args, **kwargs) print("函数执行后的操作") return result return wrapper @decorator def say_hello(): print("Hello, Python!") say_hello()

输出

函数执行前的操作 Hello, Python! 函数执行后的操作

解析

  • @decorator 相当于 say_hello = decorator(say_hello),将 say_hello 函数传递给装饰器进行增强。
  • 装饰器适用于函数、类方法等,可用于日志、权限控制、性能监控等场景。

2. Python 的 deepcopycopy

问题:deepcopycopy 的区别是什么?

  • copy.copy() 浅拷贝,只拷贝对象的引用,不拷贝嵌套对象的数据。
  • copy.deepcopy() 深拷贝,递归拷贝整个对象及其嵌套对象。

代码示例

import copy # 定义嵌套列表 lst1 = [[1, 2], [3, 4]] lst2 = copy.copy(lst1) lst3 = copy.deepcopy(lst1) # 修改原列表 lst1[0][0] = 99 print(lst2) # 输出: [[99, 2], [3, 4]](浅拷贝,内部列表被修改) print(lst3) # 输出: [[1, 2], [3, 4]](深拷贝,保持原数据)

解析

  • 浅拷贝 只拷贝对象本身,嵌套对象仍然是同一引用。
  • 深拷贝 递归拷贝所有对象,保证数据完全独立。

3. Python 中的 __new____init__

问题:__new____init__ 的区别是什么?

  • __new__ 用于创建对象,属于类方法(cls 作为参数)。
  • __init__ 用于初始化对象,属于实例方法(self 作为参数)。

代码示例

class Example: def __new__(cls, *args, **kwargs): print("__new__ 被调用") instance = super().__new__(cls) # 创建实例 return instance def __init__(self, value): print("__init__ 被调用") self.value = value obj = Example(10)

输出

__new__ 被调用 __init__ 被调用

解析

  • __new__对象创建前执行,用于控制实例的创建。
  • __init__对象创建后执行,用于初始化实例属性。

4. Python 的 staticmethodclassmethod

问题:staticmethodclassmethod 有什么区别?

修饰符 作用 传递参数
@staticmethod 静态方法,不能访问类属性 selfcls
@classmethod 类方法,可以访问类属性 传递 cls 代表类

代码示例

class MyClass: class_var = "我是类变量" @staticmethod def static_method(): print("我是静态方法") @classmethod def class_method(cls): print("我是类方法,我可以访问:", cls.class_var) MyClass.static_method() # 访问静态方法 MyClass.class_method() # 访问类方法

解析

  • @staticmethod 不能访问实例或类变量,适合工具类方法。
  • @classmethod 可以访问类变量,适合操作类级别的数据。

5. Python 的 yieldyield from

问题:yieldyield from 有什么区别?

  • yield 用于生成器,逐步返回值,适合大数据处理。
  • yield from 直接委托另一个生成器的迭代,代码更简洁。

代码示例

# 使用 yield def generator1(): yield 1 yield 2 yield 3 # 使用 yield from def generator2(): yield from [1, 2, 3] print(list(generator1())) # 输出: [1, 2, 3] print(list(generator2())) # 输出: [1, 2, 3]

解析

  • yield 逐个返回值,手动迭代。
  • yield from 直接委托子生成器,代码更简洁。

6. Python 的 __call__ 方法

问题:__call__ 方法的作用是什么?

__call__对象像函数一样被调用,适用于回调函数、策略模式等场景。

代码示例

class CallableExample: def __call__(self, *args, **kwargs): print("我是 __call__ 方法,我可以像函数一样调用") obj = CallableExample() obj() # 直接调用对象

输出

我是 __call__ 方法,我可以像函数一样调用

解析

  • __call__ 使对象支持 () 语法调用,可用于缓存、日志等功能增强。

结语

本文介绍了 Python 面试中的几个高频问题,包括装饰器、拷贝、__new__ vs __init__、静态方法 vs 类方法、yield、__call__ 等内容。这些概念是 Python 进阶开发的核心知识点,掌握这些知识可以让你在面试中更加自信。

如果你觉得本文有帮助,欢迎点赞、收藏,并在评论区留言交流!🚀
👉👉点击领取python学习资料(免费分享)

https://pan.quark.cn/s/4927c35f26b8

本文是转载文章,点击查看原文
如有侵权,请联系 lx@jishuguiji.net 删除。