Python类常见面试题:这些坑90%的面试者都栽过

📅 发布时间:2026/8/5 7:35:14
Python类常见面试题:这些坑90%的面试者都栽过
不论校招, 还是社招, 面向对象皆为高频考点。今日, 我梳理了最为常见的面试题以及其坑, 看过之后面试便不会慌了。1. self到底是什么能不用吗面试题 下面的代码会报错吗class A: def method(): print(hello) a A() a.method() # 会怎样答出来的: 在进行的时候给予了但1个却会发出错讯, 规定它要采用0个。因由: 当借由实例去调用方法之际, 会将实例自行当作首个参数予以传入, 哪怕于定义时期并未书写self, 实际上却是传递了一个参数。修复class A: def method(self): # 加上self print(hello) a A() A.method() # 用类调可以不会自动传self a.method() # 实例调self自动传入2. 类变量被实例修改了面试题 运行结果是什么class A: x [1, 2, 3] a1 A() a2 A() a1.x.append(4) print(a1.x) print(a2.x) print(A.x)答案 三个输出都是1, 2, 3, 4缘由在于, x属于类变量, 列表是可变对象, a1.x.(4)对类变量自身进行了修改, 所有实例共同享有同一副本。如果改成a1.x [1, 2, 3, 4] # 这是赋值不是在原列表上修改那时, a1.x转变为实例自身所拥有的属性, 不会再对其他的人产生影响, 赋予数值和进行更改是不同的两件事情, 弄明白这个就不会遭遇失败了。3. super()的作用是什么面试题 下面代码输出什么class A: def __init__(self): print(A) class B(A): def __init__(self): print(B) super().__init__() class C(A): def __init__(self): print(C) super().__init__() class D(B, C): def __init__(self): print(D) super().__init__() d D()答案D B C A? 为何并非是 D 指向 B, 接着 B 指向 A, 随后 A 指向 C ? 此即为那所谓的 MRO方法解析顺序。用 D. 可以看print(D.__mro__) # (, , # , , )所谓super(), 并非是去调用“父类”, 而是去调用MRO当中的下一个类。这是由C3线性化算法所决定的, 在多继承的情况下, 一定要加以注意。4. 的隐藏陷阱面试题 下面的代码有什么问题class Circle: def __init__(self, radius): self.radius radius property def radius(self): return self._radius radius.setter def radius(self, value): if value 0: raise ValueError(半径必须大于0) self._radius value c Circle(5) print(c.radius) # 5 c.radius -1 # ValueError看上去像是没有问题, 实际上存在着一个隐蔽的bug, 就是里面有self.被调用了 的情况, 然而在这个时候, self.是还没有存在的状态呢这段代码能够顺利运行的缘由系于其中仅仅读取了 value, 而并未读取 self。倘若其中存在更为繁杂的逻辑, 且该逻辑依赖于已有的属性, 那么便会出现问题。安全写法def __init__(self, radius): self._radius radius # 直接赋值不走setter5. 抽象类是什么为什么要用面试题 如何让子类必须实现某个方法from abc import ABC, abstractmethod class Animal(ABC): abstractmethod def sound(self): pass # a Animal() # TypeError: Cant instantiate abstract class class Dog(Animal): pass # d Dog() # TypeError: 没实现sound() class Cat(Animal): def sound(self): return 喵 c Cat() #作用是, 用于定义接口规范, 以此强制把子类来进行实现, 进而防止因为“忘了去实现”这种情况引发运行时才出现报错的状况。6.是干嘛的面试题 为什么要用 class A: __slots__ (x, y) def __init__(self): self.x 1 self.y 2 # self.z 3 # AttributeError: A object has no attribute z a A() a.x 10 # # a.z 20 # 不允许新增属性两个作用有所限制的属性: 仅仅能够运用, 在其中所明确规定的名字, 以此来节约内存: 不会去生成, 当存在大量实例的情况下, 内存能够节省许多每个对象大约能节省50%。什么时刻运用呢? 在去构建大量对象之际像是百万级数据类那样的情况运用, 平常的情形下是不用的。7. 类方法 vs 静态方法 vs 实例方法面试高频 说说三者的区别并各举一个使用场景。记忆技巧: 存在需要进行操作的实例数据的情况, 这种情况下对应的是实例方法仅仅只需要类数据的情形, 其对应的是类方法各类数据都不需要然而在逻辑层面归属于这个类的状况, 所对应的是静态方法。8. 的私有属性真的私有吗面试题 真的能保护数据吗class Secret: def __init__(self): self.__password 123456 s Secret() # s.__password # AttributeError print(s._Secret__password) # 123456 竟然能访问真相是, 那种所谓的私有并非真正意义上的私有, 只是有着名字修饰罢了, 具体而言, 是编译器将属性名改成了带有类名前缀的__属性名, 这属于一种“防君子不防小人”的机制, 其目的在于防止子类出现意外覆盖的情况。一句话总结搞清楚类的面试题中, 万变不离其宗的那些内容, 也就是self、MRO、类变量与实例变量、原理, 如此一来, 大部分面试题都能够答上来。收藏这篇面试前翻一遍。关注我陪你从入门到拿Offer。# #面试 #面向对象 #编程进阶