
Python 类与对象 属性的魔法方法
发布日期:2021-05-07 23:05:31
浏览次数:21
分类:精选文章
本文共 1582 字,大约阅读时间需要 5 分钟。
Python的属性访问机制通过魔法方法提供了对对象属性的强大控制能力。在Python中,属性的定义、获取、设置以及删除都有对应的魔法方法可以自定义行为。这种机制使得开发者能够灵活地管理对象属性,而不必依赖传统的继承机制。
1. 属性访问魔法方法
在Python中,属性的获取通常通过以下两个魔法方法实现:
__getattribute__(self, name)
: 当试图访问对象的属性时,Python首先调用这个方法。如果属性不存在,则会调用__getattr__(self, name)
。__getattr__(self, name)
: 当尝试访问一个不存在的属性时,Python调用这个方法。返回值通常是一个函数,可以用于动态创建属性。
例如:
class OO: def __getattribute__(self, name): print("getattribute") return super().__getattribute__(name) def __getattr__(self, name): print("getattr") return super().__getattr__(name)
通过这些方法,可以控制属性的访问行为。例如,当试图访问一个不存在的属性时,可以通过__getattr__
创建该属性。
2. 属性设置魔法方法
属性的设置通过以下魔法方法实现:
__setattr__(self, name, value)
: 定义当对象属性被设置时的行为。如果直接赋值(如obj.x = 2
),则会调用这个方法。__delattr__(self, name)
: 定义当对象属性被删除时的行为。
例如:
class Rectangle: def __init__(self, height=0, width=0): self.height = height self.width = width def __setattr__(self, name, value): if name == "square": self.height = value self.width = value else: super().__setattr__(name, value) def getArea(self): return self.height * self.width
在这个例子中,__setattr__
方法被用来限制属性的设置行为。如果尝试设置square
属性,则会同时设置height
和width
属性。否则,会使用默认的属性设置行为。
3. 改进魔法方法
为了避免递归死循环或其他潜在问题,可以通过以下方式改进魔法方法:
-
使用
super()
函数:调用父类的魔法方法,确保继承链中的方法得到正确执行。例如:def __setattr__(self, name, value): super().__setattr__(name, value)
-
使用
__dict__
属性:通过self.__dict__
访问对象的属性字典,可以直接修改对象的属性值。例如:def __setattr__(self, name, value): self.__dict__[name] = value
这种方法提供了更直接的属性管理方式,但需要谨慎使用,以避免潜在的递归问题。
通过合理配置魔法方法,可以完全控制对象的属性行为,使代码更加灵活和可控。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月07日 20时50分11秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
C# 规范建议
2019-03-06
C语言+easyX图形库的推箱子实现
2019-03-06
反汇编-流程控制语句-2-循环控制语句分析
2019-03-06
调试vs2019代码的流程
2019-03-06
游戏外挂基础-概述
2019-03-06
脱壳与加壳-加壳-6-代码实现加密导入表
2019-03-06
Typora配置PicGo时,提示Failed to fetch
2019-03-06
ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
2019-03-06
bcolz的新操作
2019-03-06
Linux的s、t、i、a权限(转)
2019-03-06
zmq的send
2019-03-06
C++中的delete加深认识
2019-03-06
windows消息机制(转)
2019-03-06
STL笔试面试题总结(干货)(转)
2019-03-06
XML 和 HTML 之间的差异
2019-03-06
阿里钉钉面试题
2019-03-06
华为社招笔试
2019-03-06
C++中找资源或者函数的方法
2019-03-06
一些留给自己的思考题(只求回过头来能够有所获)
2019-03-06
SQL函数返回表的写法
2019-03-06