Python魔法方法深入解析:属性访问控制
92 浏览量
更新于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
最新资源
- 新代数控API接口实现CNC数据采集技术解析
- Java版Window任务管理器的设计与实现
- 响应式网页模板及前端源码合集:HTML、CSS、JS与H5
- 可爱贪吃蛇动画特效的Canvas实现教程
- 微信小程序婚礼邀请函教程
- SOCR UCLA WebGis修改:整合世界银行数据
- BUPT计网课程设计:实现具有中继转发功能的DNS服务器
- C# Winform记事本工具开发教程与功能介绍
- 移动端自适应H5网页模板与前端源码包
- Logadm日志管理工具:创建与删除日志条目的详细指南
- 双日记微信小程序开源项目-百度地图集成
- ThreeJS天空盒素材集锦 35+ 优质效果
- 百度地图Java源码深度解析:GoogleDapper中文翻译与应用
- Linux系统调查工具:BashScripts脚本集合
- Kubernetes v1.20 完整二进制安装指南与脚本
- 百度地图开发java源码-KSYMediaPlayerKit_Android库更新与使用说明