首页 > 其他分享 >面向对象魔术方法

面向对象魔术方法

时间:2023-09-14 09:58:00浏览次数:31  
标签:__ .__ obj setattr 魔术 面向对象 dict 方法 属性

目录

1.__setattr__如何使用

setattr 是 Python 中的一个特殊方法(魔术方法),用于自定义对象的属性赋值操作。当您尝试设置对象的属性时,Python 会自动调用 setattr 方法,允许您在属性赋值时添加自定义逻辑。这个方法可以用于数据验证、计算、记录属性更改等操作。

以下是如何使用 setattr 方法的示例:

class MyClass:
    def __init__(self, x):
        self.x = x

    def __setattr__(self, name, value):
        if name == 'x':
            if value < 0:
                raise ValueError("x cannot be negative")
        # 使用 super() 避免无限递归
        super().__setattr__(name, value)

obj = MyClass(10)
print(obj.x)  # 输出 10

# 尝试设置 x 为负数,触发异常
try:
    obj.x = -5
except ValueError as e:
    print(e)  # 输出 "x cannot be negative"

在上面的示例中,我们定义了一个 MyClass 类,该类具有一个属性 x。在 setattr 方法中,我们添加了一个自定义检查,如果尝试将 x 设置为负数,则会引发 ValueError 异常。

注意以下几点:

setattr 方法中,我们首先检查属性的名称是否为 'x',然后检查属性值是否小于 0。
我们使用 super().setattr(name, value) 来实际设置属性的值。这是因为直接在 setattr 方法中调用 self.x = value 会导致无限递归调用 setattr
使用 setattr 方法可以允许您在属性设置时执行自定义逻辑,例如数据验证、属性更改记录、计算相关属性等。这对于确保对象的属性处于一致的状态非常有用。然而,要小心使用它,以避免无限递归或使代码变得复杂。

2.__dict__如何使用

dict 是 Python 中用于访问对象的属性字典的特殊属性。这个属性是一个包含对象的所有属性和它们的值的字典,可以用于查看和修改对象的属性。

以下是如何使用 dict 属性的示例:

class MyClass:
    def __init__(self, x, y):
        self.x = x
        self.y = y

obj = MyClass(10, 20)

# 访问对象的属性字典
print(obj.__dict__)
# 输出:{'x': 10, 'y': 20}

# 添加新属性
obj.__dict__['z'] = 30
print(obj.z)  # 输出 30

# 修改属性值
obj.__dict__['x'] = 100
print(obj.x)  # 输出 100

# 删除属性
del obj.__dict__['y']
print(obj.__dict__)
# 输出:{'x': 100, 'z': 30}

需要注意以下几点:

dict 属性返回一个字典,其中包含了对象的属性名作为键和属性值作为值。
您可以使用 obj.dict[key] 来访问属性值,其中 key 是属性名。
您也可以使用 obj.dict[key] = value 来添加新属性或修改属性的值。
使用 del obj.dict[key] 可以删除属性。
尽管 dict 属性提供了一种动态操作对象属性的方式,但通常情况下,直接访问对象的属性(例如 obj.x)或使用属性访问器(例如 getattr(obj, 'x') 和 setattr(obj, 'x', value))更加推荐,因为它们更符合 Python 的习惯用法并提供更好的可读性。

使用 dict 属性时需要格外小心,因为它绕过了属性的 getter 和 setter 方法,可能导致意外的行为或破坏封装性。一般来说,最好避免直接操作 dict,而是使用属性访问器和属性定义来管理对象的属性。

标签:__,.__,obj,setattr,魔术,面向对象,dict,方法,属性
From: https://www.cnblogs.com/yuezongke/p/17701465.html

相关文章

  • 【Vuejs】Date()常用方法
    Date()常用方法vardate=newDate()console.log(date);//FriOct29202114:18:13GMT+0800(中国标准时间)console.log(date.getMonth());//获取月份(0-11,0代表1月,所以在显示当前时间的时候需要date.getMonth()+1)console.log(date.getYear());......
  • 三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析
    三维模型3DTile格式轻量化压缩的遇到常见问题与处理方法分析 三维模型的轻量化压缩是一项技术挑战,特别是在处理复杂的3DTile格式时。下面列举了一些处理过程中可能遇到的常见问题以及相应的处理方法:模型精度损失:在进行压缩处理时,由于顶点减少或数据精度降低,可能导致模型的精......
  • 在Linux上使用netstat命令查证DDOS攻击的方法
    服务器出现缓慢的状况可能由很多事情导致,比如错误的配置,脚本和差的硬件。但是有时候它可能因为有人对你的服务器用DoS或者DDoS进行洪水攻击。DoS攻击或者DDoS攻击是试图让机器或者网络资源不可用的攻击。这种攻击的攻击目标网站或者服务通常是托管在高防服务器比如银行,信用卡支......
  • 13 动态创建对象执行方法
    反射的作用packageannotate;importjava.lang.reflect.Constructor;importjava.lang.reflect.Field;//通过反射,动态创建对象publicclassTest12{publicstaticvoidmain(String[]args)throwsException{Classc1=Body.class;//1......
  • 面向对象编程二(类属性与实例属性,类方法与实例方法)
    类属性与实例属性案例:#1.定义员工类Employee,属性:姓名,薪资#2.增加类属性:员工薪资信息列表#3.尝试添加对应的类方法,实例方法#类方法:对员工薪资进行排名#实例方法:每新增一个员工,添加到列表中#4.测试并执行打印结果classEmployee:salary_list=[]#2.增加......
  • 【C语言】scanf多组输入的三种方法!
    (文章目录)前言  <fontcolor=green>......
  • 生态保护红线划定与评估中气象因子计算方法 学习记录
    声明本文是学习GB-T42960-2023生态保护红线划定与评估中气象因子计算方法.而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们1范围本文件规定了生态保护红线划定与评估中气象资料选取的要求,描述了气象因子计算的方法。本文件适用于生态功能的调查和生态保护......
  • 最好的方法引用文章【转载】
    https://developer.aliyun.com/article/1324717?spm=a2c6h.12873639.article-detail.19.3b172f69wPEsWfhttps://developer.aliyun.com/article/1315631 简介: Java方法四种引用1Java的四种引用,强弱软虚1.1强引用强引用是平常中使用最多的引用,强引用在程序内存不......
  • [git] 报错unsafe repository xxx is owned by someone else解决方法
    git进行了版本升级,添加了新的目录安全限制。造成在进行git常规操作时,或在各类编辑器如VSCode中无法发现.git文件,报错:fatal:unsaferepository(xxxisownedbysomeoneelse.)Toaddanexceptionforthisdirectory,callgitconfig–global–addsafe.directory方......
  • 使用Photoshop制作印章的方法,添加杂点一步做旧
    电子文档越来越多了,比如经常收到的报价单等,下面就教大家,如何使用Photoshop做一个印章图片,最终效果图如下:1.新建文件宽度、高度根据需要自定,其他默认。2.新建一个图层,用来放置印章的外圆。3.点击椭圆工具,按住鼠标和shift键,画出一个圆形。4.双击这个圆所在的图层,打开图层样式对......