面试题答案
一键面试在Python中,@property
、@属性名.setter
等装饰器可用于实现类属性的封装和数据隐藏。
-
实现封装和数据隐藏:
@property
装饰器将一个方法转换为属性,使得可以像访问普通属性一样访问该方法,同时隐藏了属性的实现细节。@属性名.setter
装饰器用于定义属性的设置方法,从而控制属性的赋值操作。
-
定义只读属性: 只使用
@property
装饰器,不定义@属性名.setter
方法,这样该属性就只能读取,不能修改。
示例代码如下:
class Person:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
p = Person('Alice')
print(p.name) # 访问只读属性
# p.name = 'Bob' # 尝试赋值会报错,因为name是只读属性
- 定义可读写属性:
使用
@property
装饰器定义读取方法,使用@属性名.setter
装饰器定义设置方法。
示例代码如下:
class Rectangle:
def __init__(self, width, height):
self._width = width
self._height = height
@property
def width(self):
return self._width
@width.setter
def width(self, value):
if value > 0:
self._width = value
else:
raise ValueError("Width must be a positive number")
@property
def height(self):
return self._height
@height.setter
def height(self, value):
if value > 0:
self._height = value
else:
raise ValueError("Height must be a positive number")
r = Rectangle(5, 10)
print(r.width) # 读取宽度
r.width = 7 # 设置宽度
print(r.width) # 再次读取宽度
# r.width = -3 # 尝试设置负数宽度会报错
通过上述方式,可以有效地在Python类中实现属性的封装、数据隐藏,以及定义只读和可读写属性。