面试题答案
一键面试from abc import ABC, abstractmethod
class MetaGeometricObject(type):
def __new__(mcs, name, bases, attrs):
if not any('area' in base.__dict__ for base in bases):
if 'area' not in attrs:
raise NotImplementedError(f"Subclass {name} must implement 'area' method.")
if not any('perimeter' in base.__dict__ for base in bases):
if 'perimeter' not in attrs:
raise NotImplementedError(f"Subclass {name} must implement 'perimeter' method.")
return super().__new__(mcs, name, bases, attrs)
class GeometricObject(ABC, metaclass=MetaGeometricObject):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Square(GeometricObject):
def __init__(self, side):
self.side = side
def area(self):
return self.side * self.side
def perimeter(self):
return 4 * self.side
class Triangle(GeometricObject):
def __init__(self, side1, side2, side3):
self.side1 = side1
self.side2 = side2
self.side3 = side3
def area(self):
s = (self.side1 + self.side2 + self.side3) / 2
return (s * (s - self.side1) * (s - self.side2) * (s - self.side3)) ** 0.5
def perimeter(self):
return self.side1 + self.side2 + self.side3
这种设计在大型项目架构中的意义
- 规范与约束:抽象基类和自定义元类确保了所有几何对象子类都遵循统一的接口规范,即必须实现
area
和perimeter
方法。这有助于提高代码的一致性和可维护性,减少因接口不一致导致的错误。 - 代码复用:通过抽象出通用的接口,使得在大型项目中可以将与几何对象相关的通用操作抽象出来,减少重复代码。例如,在图形渲染模块中,无论具体是正方形还是三角形,都可以通过
area
和perimeter
方法获取相关信息,而无需为每个子类单独编写特定的代码。 - 扩展性:当需要添加新的几何对象子类时,只需要确保实现抽象基类中定义的方法即可,不会影响到项目中其他与几何对象相关的模块,有利于项目的长期维护和扩展。
利用多态处理不同几何对象的通用操作
在Python中,可以通过定义一个接受GeometricObject
类型参数的函数,利用多态来处理不同几何对象的通用操作。例如:
def print_geometry_info(geo_obj):
print(f"Area: {geo_obj.area()}")
print(f"Perimeter: {geo_obj.perimeter()}")
square = Square(5)
triangle = Triangle(3, 4, 5)
print_geometry_info(square)
print_geometry_info(triangle)
在上述代码中,print_geometry_info
函数接受一个GeometricObject
类型的对象,无论传入的是Square
还是Triangle
对象,都可以正确调用其area
和perimeter
方法,这就是多态的体现。通过这种方式,可以对不同的几何对象进行统一的操作,而无需关心其具体类型。