Python魔法方法深入解析:属性访问控制
26 浏览量
更新于2024-08-28
收藏 134KB PDF 举报
"Python属性访问控制详解,通过魔法方法实现对对象属性的自定义访问规则"
在Python编程中,属性访问控制是指控制类的属性通过点号`.`被访问的行为。这不仅包括类的外部访问,还包括类的内部逻辑。Python提供了一些特殊的魔法方法,允许开发者在特定条件下定制属性访问的行为。本篇将详细介绍`__getattr__`这个魔法方法,它是用来处理访问不存在的属性时的行为。
`__getattr__`方法的定义如下:
```python
def __getattr__(self, item):
```
当尝试访问一个对象的属性,如果该属性在类的`__dict__`或继承链中都找不到,Python就会调用`__getattr__`方法。在这个方法中,`item`参数代表了尝试访问的属性名称,是一个字符串类型。
来看一个简单的例子:
```python
class Foo(object):
def __init__(self, value):
self.value = value
def __getattr__(self, item):
print(item)
print(type(item))
return 'attr:%s' % item
```
在这个例子中,如果创建一个`Foo`的实例`a`并尝试访问`a.value`,由于`value`属性存在,`__getattr__`不会被调用。然而,如果访问`a.abc`这样的不存在属性,`__getattr__`会被调用,打印出`abc`及其类型,并返回一个字符串。
通过`__getattr__`,我们可以定制类的行为,比如处理访问不存在属性的情况:
```python
class Foo(object):
def __init__(self, value):
self.value = value
def __getattr__(self, item):
if item == 'scolia':
return 'cannot setattr:{}'.format(item) # 特殊处理'scolia'属性访问
else:
raise AttributeError('not attr name:{}'.format(item)) # 其他不存在属性触发异常
```
在这个版本的`Foo`类中,访问`a.scolia`不会抛出异常,而是返回一条消息。而访问其他不存在的属性,如`a.good`,会引发`AttributeError`。
需要注意的是,`__getattr__`只在属性确实不存在时才生效。如果尝试赋值给一个不存在的属性,如`a.scolia = 321`,Python会在内存中创建一个`scolia`属性,因此后续的`a.scolia`访问不会触发`__getattr__`。这表明`__getattr__`不会影响到动态添加的属性。
总结来说,`__getattr__`是Python中实现属性访问控制的重要工具,允许开发者在访问不存在的属性时执行自定义逻辑,从而扩展类的行为。通过巧妙利用这个魔法方法,可以创建更加灵活和健壮的类设计。在实际编程中,可以根据需求来定制`__getattr__`,比如实现属性的懒加载、属性的默认值或者更复杂的属性访问策略。
2021-01-20 上传
2020-09-21 上传
2020-09-19 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-09-21 上传
2020-12-21 上传
点击了解资源详情
weixin_38682161
- 粉丝: 3
- 资源: 972
最新资源
- react_website
- HCMGIS_Caytrong_Local
- 毕业设计&课设--毕业设计之鲜花销售网站的设计与实现.zip
- django-compiling-loader:Django的编译模板加载器
- Excel模板送货单EXCEL模板.zip
- tfbert:一个使用tf2复现的bert模型库
- 商用服务机器人行业研究报告-36氪-2019.8-47页.rar
- 愤怒的小鸟
- recommend-go:用户偏好推荐系统
- react-selenium-ui-test-example:示例项目显示了如何将Selenium Webdriver与Mocha结合使用以在本地环境中运行UI级别测试
- AttachmentManager:附件管理器库从Android设备中选择文件图像
- Excel模板财务报表-现金收支日记账.zip
- jquery-browserblacklist:处理浏览器黑名单的 jQuery 插件
- 毕业设计&课设--毕业设计--在线挂号系统APP(VUE).zip
- 017.长治市行政区、公交线路、 物理站点、线路站点、建成区分布卫星地理shp文件(2021.3.28)
- yfcmf-tp6:yfcmf新版本,基于thinkphp6.0和fastadmin