Python 面试题:面向对象 1
什么是引用赋值?
引用就是对象在内存中的数字地址编号,变量就是方便对引用的表示而出现的,变量指向的就是此引用。赋值的本质就是让多个变量同时引用同一个对象的地址。
Python 有哪些数据类型?(需要写出每种类型的常用方法)
- 整型
- 列表
- 元组
- 字典
- 字符串
- 集合
- 布尔
什么是不可变对象,什么是可变对象?
所有Python对象都拥有三个属性:身份、类型、值。
In [1]: name = "laowang" # name对象
In [2]: id(name) # id:身份的唯一标识
Out[2]: 1698668550104
In [3]: type(name) # type:对象的类型,决定了该对象可以保存什么类型的值
Out[3]: str
In [4]: name # 对象的值,表示的数据
Out[4]: 'laowang'
- 可变对象: 列表、字典、集合
所谓可变是指可变对象的值可变,身份是不变的。
- 不可变对象:数字、字符串、元组
不可变对象就是对象的身份和值都不可变。新创建的对象被关联到原来的变量名,旧对象被丢弃,垃圾回收器会在适当的时机回收这些对象。
如何创建不可变数据对象
# python 3.7 以上
from dataclasses import dataclass
@dataclass(frozen=True)
class Container:
val: int
c = Container(2)
print(c.val)
有哪些可变对象,哪些不可变对象?
-
不可变对象:字符串、元组、整型
-
可变对象:数组、字典、集合
浅拷贝和深拷贝
浅拷贝
- 不可变对象的浅拷贝实际上是让多个对象同时指向一个引用,和对象的赋值没区别。
- 可变对象的浅拷贝,会在内存中开辟一个新的空间来保存拷贝的数据。当再改变之前的对象时,对拷贝之后的对象没有任何影响。
深拷贝
- 区别于浅拷贝只拷贝顶层引用,深拷贝会逐层进行拷贝,直到拷贝的所有引用都是不可变引用为止。
检查两个字符串是不是由相同字母不同顺序组成

查找列表中频率最高的值

反转字符串

复制列表

合并字典

字典访问不存在的key 时,如何才能不报错?
- 使用 defaultdict

- 继承dict,重构 missing 方法
类方法、实例方法、静态方法有什么区别
-
在类中定义的普通方法即为类的实例方法,第一个参数为 self 代表实例本身,当调用某个实例方法时,该实例的对象引用作为第一个参数 self 隐式的传递到方法中。
-
类方法是与类绑定的方法。类方法有一个约定的参数 cls 代表类本身,python 会自动将类本身传给 cls, 不需要我们传参。类方法必须使用 @classmethod 装饰器声明。
-
静态方法就是普通的函数,只是碰巧在类的定义体中,而不是在模块层定义,不能访问类属性。主要是让静态方法放在此类的名称空间之内,从而能够更加有组织性。使用时需在加上@staticmethod 装饰器。
is 和 == 的区别?
-
比较操作符'=='表示比较对象间的值是否相等,默认会调用对象的 eq() 方法,而'is'表示比较对象的标识是否相等,即它们是否指向同一个内存地址。
-
比较操作符'is'效率优于'==',因为'is'操作符无法被重载,执行'is'操作只是简单的获取对象的 ID,并进行比较;而'=='操作符则会递归地遍历对象的所有值,并逐一比较。
super() 函数的使用场景
- 调用父类的方法
谈谈你对实例方法中 self 的理解 ?
- self 一般作为实例方法的第一个参数,代表实例自身
- self 也可以由其他名称代替
- def methodA(self, arg1, arg2) 会被转化为 ClassA.methodA(ObjectA, arg1, arg2),这样就知道在哪个实例上使用这个方法。
什么是上下文管理器?为什么要用上下文管理器?
- 在一个类里,实现了__enter__和__exit__的方法,这个类的实例就是一个上下文管理器。
- 可以以一种更加优雅的方式,操作(创建/获取/释放)资源,如文件操作、数据库连接、网络连接、锁;
- 可以以一种更加优雅的方式,处理异常。异常可以在__exit__ 进行捕获并由你自己决定如何处理,是抛出呢还是在这里就解决了。exc_type:异常类型、exc_val:异常值、exc_tb:异常的错误栈信息。
浙公网安备 33010602011771号