python面向对象

1、类中的__setattr__、__getattr__、__delattr__ 方法;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Test(object):
    def __init__(self):
        self.storage = {}
 
    def __setattr__(self, key, value):
        self.storage[key] = value
 
    def __getattr__(self, item):
        return self.storage.get(item)   # 会提示改行报错:RecursionError: maximum recursion depth exceeded
    # 分析:在init中 self.storage = {} 会调用 __setattr__ 方法进行属性设置,而 __setattr__ 方法中的 self.storage[key] 相当于获取
    # 获取属性值,会调用 __getattribute__ 方法,然而 __getattribute__ 方法中的 self.storage.get(item) 相当于获取 self.storage 的
    # 值,从而有会调用 __getattribute__ 的方法,如此循环;
 
 
obj = Test()
obj.data = 32
print(obj.data)

  改进

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Test(object):
    def __init__(self):
        object.__setattr__(self, "storage", {})  # 显示调用父类的属性设置方法来进行属性设置,避免当前对象出现循环调用自身的 __getattr__
        # self.storage = {}
 
    def __setattr__(self, key, value):
        self.storage[key] = value
 
    def __getattr__(self, item):
        return self.storage.get(item)
 
 
test = Test()
test.data = 32
print(test.data)

  

 

posted @   青灯浊酒  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
点击右上角即可分享
微信分享提示