面试题答案
一键面试1. Python中抽象类的定义方式
在Python中,定义抽象类需要使用abc
模块(Abstract Base Classes)。abc
模块提供了定义抽象基类的基础设施。
2. 定义一个抽象类以及包含抽象方法的示例
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
import math
return math.pi * self.radius * self.radius
3. 模拟接口功能
在Python中,虽然没有传统意义上的接口概念,但可以通过抽象类和抽象方法来模拟接口的功能。
- 抽象类和抽象方法:像上面示例中的
Shape
抽象类,强制子类必须实现area
方法,这就类似接口定义的契约,子类必须遵守。 - 多重继承:可以通过多重继承多个只包含抽象方法的抽象类,来实现类似接口多继承的效果。例如:
from abc import ABC, abstractmethod
class Printable(ABC):
@abstractmethod
def print_info(self):
pass
class Serializable(ABC):
@abstractmethod
def serialize(self):
pass
class MyClass(Printable, Serializable):
def print_info(self):
print("Info about MyClass")
def serialize(self):
return "Serialized data of MyClass"
- 使用协议(Protocols):Python 3.8 引入了
typing.Protocol
,它允许定义结构类型(structural typing),在运行时不强制检查,但在类型检查时能提供类似接口的功能。例如:
from typing import Protocol
class Writeable(Protocol):
def write(self, data):
pass
class FileWriter:
def write(self, data):
with open('file.txt', 'w') as f:
f.write(data)
def write_to(w: Writeable, data):
w.write(data)
file_writer = FileWriter()
write_to(file_writer, "Some data")
在这个例子中,Writeable
协议定义了write
方法,只要类实现了这个方法,就可以被视为符合Writeable
协议,类似接口的行为。