在2021年的护网行动面试题目中,面试者可能会被问及如何在Python编程中避免重复定义执行相同逻辑的属性方法,特别是在类定义中。例如,如`Person`类中对`name`和`age`属性的类型检查。原始代码中,为了实现属性值的类型检查,编写了大量重复的setter和getter方法,这不仅冗余,也不易维护。
一种解决这种问题的方法是采用装饰器和函数来简化代码。可以创建一个名为`typed_property`的通用函数,用于定义带有类型检查的属性。这个函数接受两个参数:属性名和期望的数据类型。它内部会定义一个私有存储变量(例如 `_name`),然后定义getter和setter,后者会在设置属性值时进行类型验证。这样,每当需要为新的属性添加类型检查时,只需要调用这个函数,而无需为每个属性单独编写代码。
具体实现如下:
```python
def typed_property(name, expected_type):
storage_name = '_' + name
@property
def prop(self):
return getattr(self, storage_name)
@prop.setter
def prop(self, value):
if not isinstance(value, expected_type):
raise TypeError(f"{name} must be a {expected_type.__name__}")
setattr(self, storage_name, value)
# 使用例子:
class Person:
def __init__(self, name, age):
self.name = typed_property('name', str)
self.age = typed_property('age', int)
# 类的其他方法...
```
通过这种方式,可以大大提高代码的复用性和整洁度,减少重复性工作,并且使得属性的类型检查更加模块化。此外,这种方法也体现了Python中面向对象编程的一些原则,如DRY(Don't Repeat Yourself)原则,即避免代码冗余,提高代码的可维护性和扩展性。在实际编程中,当遇到需要频繁定义相似逻辑的场景时,学会这种技巧是非常有用的。《PythonCookbook》第三版中也推荐了类似的实践,展示了如何利用Python的强大功能来优化代码结构。