高频 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 的 deepcopy
和 copy
问题:deepcopy
和 copy
的区别是什么?
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 的 staticmethod
和 classmethod
问题:staticmethod
和 classmethod
有什么区别?
修饰符 | 作用 | 传递参数 |
---|---|---|
@staticmethod |
静态方法,不能访问类属性 | 无 self 或 cls |
@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 的 yield
和 yield from
问题:yield
和 yield 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学习资料(免费分享)