本文是Python面试专栏的第三篇。在本专栏中,我将总结华为、阿里巴巴、字节跳动等互联网公司 Python 面试中最常见的 100+ 问题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。这些面试题涉及 Python 基础知识、Python 编程、数据分析以及 Python 函数库等多个方面。
Python 面试的高阶问题
39. 简述面向对象的三大特性?
面向对象编程(Object-Oriented Programming,OOP)有三大特性,分别是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。
- 封装(Encapsulation):
- 封装是指将数据和操作(方法)组合在一起形成一个独立的单元,对外部隐藏内部实现细节。通过封装可以保护数据的安全性,只能通过预定义的接口(方法)访问和修改数据。
- 封装可以使代码更加模块化和可维护,减少了对外部的依赖性,提高了代码的可重用性和安全性。
- 继承(Inheritance):
- 继承是指一个类(子类)可以继承另一个类的属性和方法,从而避免了重复编写相同的代码。被继承的类称为父类或基类,继承的类称为子类或派生类。
- 通过继承,子类可以拥有父类的属性和方法,并且可以在此基础上进行扩展或修改。
- 多态(Polymorphism):
- 多态是指同一种操作或方法可以应用于不同类型的对象,而产生不同的行为。通过多态,可以以统一的方式对不同的对象进行操作,无需关心对象具体的类型。
- 多态性使得程序更加灵活和可扩展,可以通过定义抽象类、接口或基类来实现统一的方法签名,然后由不同的子类实现自己的具体行为。这样可以提高代码的可读性、可维护性和可扩展性。
这三大特性是面向对象编程的基础,共同支持着代码的重用、封装和抽象,使得我们能够以更高效和结构化的方式进行软件开发。
40. 如何在 Python 中创建类?
要在 Python 中创建类,我们使用关键字 class,如下例所示
class MLPEmployee: def __init__(self, emp_name): self.emp_name = emp_name
要从上面创建的类实例化或创建对象,我们执行以下操作:
emp_1 = MLPEmployee("Mr Employee")
要访问 name
属性,我们只需使用 .
运算符调用该属性,如下所示:
print(emp_1.emp_name) # Print Mr Employee
为了在类中创建方法,我们将方法包含在类的作用域下,如下所示
class MLPEmployee: def __init__(self, emp_name): self.emp_name = emp_name def introduce(self): print("Hello I am " + self.emp_name)
__init__ 和 introduce 函数中的 self 参数表示对当前类实例的引用,该实例用于访问该类的属性和方法。
self 参数必须是类中定义的任何方法的第一个参数。可以访问类 MLPEmployee 中的方法,如下所示:
emp_1.introduce()
整个基本的类的创建示例如下:
class MLPEmployee: def __init__(self, emp_name): self.emp_name = emp_name def introduce(self): print("Hello I am " + self.emp_name) # create an object of MLPEmployee class emp_1 = MLPEmployee("Mr Employee") print(emp_1.emp_name) #print employee name emp_1.introduce() #introduce the employee
在 Python 中,类是面向对象编程的基本组件之一,它允许我们创建具有属性和方法的自定义数据类型。
41. 有什么方法可以获取类的所有属性和方法?
在 Python 中,可以使用内置函数 dir() 来获取类的所有属性和方法。dir() 函数返回一个列表,包含了指定对象(包括类)所拥有的所有有效属性和方法的名称。
以下是一个示例代码,展示了如何使用 dir() 函数获取类的所有属性和方法:
class MyClass: def __init__(self): self.name = "Alice" def greet(self): print("Hello, my name is", self.name) def say_hello(self): print("Hello!") obj = MyClass() print(dir(obj))
运行上述代码,会输出包含了 MyClass
类的所有属性和方法的列表,例如:
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'greet', 'name', 'say_hello']
需要注意的是,dir() 函数不仅适用于类对象,也可以用于其他对象、模块以及内置类型等。它返回的列表可能包含一些特殊命名的属性和方法,以双下划线开头和结尾的属性和方法,这些通常是 Python 内部定义的特殊成员。
42. 继承在 Python 中是如何工作的?
在 Python 中,继承(Inheritance)是一种实现代码重用和建立类之间关系的机制。通过继承,一个类(称为子类或派生类)可以从另一个类(称为父类或基类)继承属性和方法。
Python 支持不同类型的继承,包括:
- 单一继承:子类派生一个父类的成员。
# Parent class class ParentClass: def par_func(self): print("I am parent class function") # Child class class ChildClass(ParentClass): def child_func(self): print("I am child class function") # Driver code obj1 = ChildClass() obj1.par_func() obj1.child_func()
多层继承:父类 A 由子类 B 继承,子类 B 再由另一个子类 C 继承。基类和派生类的功能进一步继承到新的派生类 C 中。在这里,A 是 C 的祖父类。
# Parent class class A: def __init__(self, a_name): self.a_name = a_name # Intermediate class class B(A): def __init__(self, b_name, a_name): self.b_name = b_name # invoke constructor of class A A.__init__(self, a_name) # Child class class C(B): def __init__(self, c_name, b_name, a_name): self.c_name = c_name # invoke constructor of class B B.__init__(self, b_name, a_name) def display_names(self): print("A name : ", self.a_name) print("B name : ", self.b_name) print("C name : ", self.c_name) # Driver code obj1 = C('child', 'intermediate', 'parent') print(obj1.a_name) obj1.display_names()
多重继承:当一个子类从多个父类派生成员时,就会实现这一点。 子类继承了父类的所有功能。
# Parent class1 class Parent1: def parent1_func(self): print("Hi I am first Parent") # Parent class2 class Parent2: def parent2_func(self): print("Hi I am second Parent") # Child class class Child(Parent1, Parent2): def child_func(self): self.parent1_func() self.parent2_func() # Driver's code obj1 = Child() obj1.child_func()
分层继承:当一个父类由多个子类派生时,称为分层继承。
# Base class class A: def a_func(self): print("I am from the parent class.") # 1st Derived class class B(A): def b_func(self): print("I am from the first child.") # 2nd Derived class class C(A): def c_func(self): print("I am from the second child.") # Driver's code obj1 = B() obj2 = C() obj1.a_func() obj1.b_func() # child 1 method obj2.a_func() obj2.c_func() # child 2 method