news 2026/5/13 19:11:24

Python大厂常见面试题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python大厂常见面试题

1、python中属性的可见性

在类中定义的属性、方法都是有一定的可见性的,也就是在哪里可以看到、可以访问。在Python中,可见性分为三种: 公共的、保护的、私有的。

主要靠命名方式来区分:

公共的

在任何的位置都可以访问,默认

默认创建的属性、方法都是公共的可见性,不需要什么操作

保护的

只能够在当前的模块中访问

使用一个下划线开头,例如: _age

私有的

只能够在当前的类中访问

使用两个下划线开头,例如: __age

#类以外,直接访问__age是访问不到的
# 因为Python在存储这个属性的时候,并不是按照__age来存储的,而是按照 _类名__age 来存储的
# 使用下面的访问,访问属性,看看是不是成功的访问到了!
print(x._Person__age)

2、继承的写法,多继承的二义性怎么解决

单继承:class 子类(父类)

class Employee: def __init__(self, empno, name, sal): self.empno = empno self.name = name self.sal = sal print("Employee.__init__") class Manager(Employee): def __init__(self, award): self.award = award print("Manager.__init__")

多继承:class 子类(父类,父类,父类...)

# 定义父类1 class Father: def test_function(self): print("father function impl") def test1(self): print("test1") # 定义父类2 class Mother: def test_function(self): print("mother function impl") def test2(self): print("test2") # 定义子类,同时继承自两个父类 class Son(Father, Mother): def test_function(self): # 调用父类中的实现,区分父类调用的时候,只能使用父类名字来区分 # Father.test_function(self) Mother.test_function(self)

继承的二义性:子类的多个父类中,包含了相同的函数 test_function,并且实现的方式不同。那么子类该何去何从?该继承哪个父类中的函数呢?这样的问题就是"二义性"
在Python中,如果出现这种情况,继承到的是小括号中写的第一个类!
s.test_function()

3、__dict__ __slots__ 区别

Python会为每一个对象分配一个__dict__属性,这是一个字典,存储的就是每一个对象的属性和值的键值对,来实现Python作为一个动态的语言,对象可以动态的绑定属性的功能;

从内存上来说,每一个对象都会分配一个__dict__字典,而字典底层采用的数据结构是哈希表,是一种以空间换时间的数据结构。因此带来的内存的开销比较大。为了解决这样的问题,我们可以在类中定义__slots__来解决这样的问题!

__slots__是一个不可变的容器,通常我们将需要为这个类设计的属性,以元组的形式表示。在进行空间分配的时候,Python解释器直接会开辟合适的、固定的内存空间来存储每一个属性的值,从而达到节省空间的目的。

注意事项:

  • 如果给一个类设置了__slots__,那么将不会再为每一个属性提供__dict__
  • 设置了__slots__之后,将无法再给这个对象动态绑定其他的属性

1. 先纠正两个核心误区

误区一:__dict__不是 “要自己写” 的

__dict__是 Python 为每个类 / 实例自动生成的一个字典,用来存储实例的所有属性。你不用手动定义它,只要类没有声明__slots__,实例就会自带__dict__,可以直接通过obj.__dict__查看或修改属性。

误区二:__slots__不是 “动态绑定下就可以”,反而会禁止动态绑定

__slots__的作用,恰恰是关闭实例的__dict__,限制实例只能拥有你提前声明的属性,禁止给实例动态添加新属性。

2. 对比说明(带代码示例)

(1)没有__slots__时:自带__dict__,支持动态绑定

class Person: def __init__(self, name): self.name = name p = Person("小明") print(p.__dict__) # 输出 {'name': '小明'} # 可以动态添加新属性(动态绑定) p.age = 18 print(p.__dict__) # 输出 {'name': '小明', 'age': 18}
  • 这里的__dict__是自动生成的,不用你写
  • 正因为有__dict__,你才能给实例动态加属性

(2)有__slots__时:关闭__dict__,禁止动态绑定

class Person: # 提前声明实例能拥有的属性 __slots__ = ('name', 'age') def __init__(self, name): self.name = name p = Person("小明") print(hasattr(p, '__dict__')) # 输出 False(没有 __dict__ 了) # 给声明过的属性赋值没问题 p.age = 18 print(p.name, p.age) # 小明 18 # 尝试动态添加未声明的属性,直接报错 # p.gender = '男' # AttributeError: 'Person' object has no attribute 'gender'
  • 声明了__slots__后,实例就不再创建__dict__
  • 动态绑定(给实例加新属性)会被禁止,只能用__slots__里写好的属性

4、都有哪些魔法方法

在类中存在一些在方法名的前后都添加上__的方法,称为“魔术方法”。魔术方法不需要手动调用,而是在适当的时机自动调用。

魔术方法

调用时机

使用场景

__new__

实例化对象,开辟内存空间的时候调用

__init__

初始化对象,属性初始化的时候调用

定义属性、完成属性的初始化赋值操作

__del__

删除对象的时候调用

释放持有的资源等

__cal__

对象函数,将对象当作函数调用的时候触发

__str__

将对象转成字符串的时候调用str()

需要将对象转为自己希望的字符串表示形式

__repr__

返回对象的规范字符串表示形式

透过容器看对象

__add__

使用 + 对两个对象相加的时候调用

完成对象相加的逻辑

__sub__

使用 - 对两个对象相减的时候调用

完成对象相减的逻辑

__mul__

使用 * 对两个对象相乘的时候调用

完成对象的乘法逻辑

__truediv__

使用 / 对两个对象相除的时候调用

完成对象的除法逻辑

__floordiv__

使用 // 对两个对象相除的时候调用

完成对象的向下整除逻辑

__mod__

使用 % 对两个对象求模的时候调用

完成对象的求模逻辑

__pow__

使用 ** 对两个对象求幂的时候调用

完成对象的求幂逻辑

__gt__

使用 > 对两个对象比较的时候调用

完成对象的大于比较

__lt__

使用 < 对两个对象比较的时候调用

完成对象的小于比较

__ge__

使用 >= 对两个对象比较的时候调用

完成对象的大于等于比较

__le__

使用 <= 对两个对象比较的时候调用

完成对象的小于等于比较

__eq__

使用 == 对两个对象比较的时候调用

完成对象的相等比较

__ne__

使用 != 对两个对象比较的时候调用

完成对象的不等比较

__contains__

使用 in 判断是否包含成员的时候调用

完成in判断包含的逻辑

5、__str__ __repr__ 区别

6、容器都包含哪些,哪些是可变的,哪些是不可变的?

容器中文可变吗
list列表✅ 可变
dict字典✅ 可变
set集合✅ 可变
tuple元组❌ 不可变
str字符串❌ 不可变

7、类方法和静态方法的区别

8、异常处理的写法

try: # 可能出错的代码 except 具体异常: # 捕获处理 else: # 没出错才执行 finally: # 无论如何都执行(关闭文件、释放资源)

9、什么是闭包

闭包:在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包

闭包(Closure)是词法闭包(Lexical Closure)的简称,是函数式编程的重要语法结构。如果一个函数里定义了一个内部函数,这个函数引用了外部函数的相关参数或变量,外部函数最终把这个内部函数返回了,那么这个内部函数被称为闭包。举个例子:

def func(x):

def inner(y):

return x + y

return inner

f = func(2) print(f) print(f(8)) print(func(2)(8)) 运行结果 <function func.<locals>.inner at 0x0000000006B4F158> 10 10

10、列表的推导式以及dict的推导式

11、循环的三种方法

for i in for i in range(长度) for k,v in enumerate(容器)

12、方法传参时,*a,**a的区别

13、python中基本的数据类型有哪些?

14、什么是可迭代类型,什么是迭代器,什么又是生成器,他们之间的区别?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/13 19:06:45

第四:BurpSuite功能使用-BurpSuite·Web站点扫描功能

一.被动扫描&#xff1a;是指Burp Suite在拦截代理模式下&#xff0c;作为中间人角色拦截和分析客户端和服务器之间的通信流量 二.主动扫描&#xff1a;是指Burp Suite通过主动发送请求来主动探测目标应用程序的漏洞 三.扫描主要使用到【 仪表盘-Dashboard】、【 目标-Target】…

作者头像 李华
网站建设 2026/5/13 19:06:07

告别模拟器!在Windows上轻松安装安卓应用的秘密武器

告别模拟器&#xff01;在Windows上轻松安装安卓应用的秘密武器 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows上安装安卓应用而烦恼吗&#xff1f;想象…

作者头像 李华
网站建设 2026/5/13 19:05:16

Adobe-GenP 3.0:5分钟快速激活Adobe全家桶的终极指南

Adobe-GenP 3.0&#xff1a;5分钟快速激活Adobe全家桶的终极指南 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款专为Adobe Creative Cloud软件…

作者头像 李华
网站建设 2026/5/13 19:05:07

Adobe-GenP 3.0终极指南:如何免费激活Adobe CC全系列软件

Adobe-GenP 3.0终极指南&#xff1a;如何免费激活Adobe CC全系列软件 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP 3.0是一款强大的Adobe Creative Cl…

作者头像 李华