__getattr__,__setattr__,__delattr__

Python属性方法
本文介绍了Python中__getattr__、__setattr__及__delattr__三个特殊方法的使用方式及其内部工作原理。通过具体示例展示了如何自定义这些方法来增强类的行为,如处理不存在属性的访问、设置属性值类型限制及删除属性。

注意:跟类无关,只对类的实例起作用

1.__getattr__                 

class Foo:
    def __init__(self,name):
        self.name=name

    # def __getattr__(self, item):
    #     print('你找的属性%s不存在'%item)

f1=Foo('alex')
print(f1.name)      #alex
print(f1.age)       #报错:AttributeError: 'Foo' object has no attribute 'age'
#类Foo本身就有内置函数__getattr__,当在类中又定义了一个__getattr__时,则执行的是新定义的

当_get_getattr__与__getattribute__一起出现时:

    当属性存在时,触发__getattribute__

    当属性不存在时,也是先触发__getattribute__,然后通过语句:raise AttributeError     触发__getattr__

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

    def __getattr__(self, item):
        print('执行的是getattr')
        # return self.__dict__[item]
    # def __getattribute__(self, item):
    #     print('执行的是getattribute')
    #     raise AttributeError('抛出异常了')
        # raise TabError('xxxxxx')
f1=Foo(10)
# f1.x
f1.xxxxxx #不存在的属性访问,触发__getattr__

 

2.__setattr__

# class Foo:
#     def __init__(self,name):
#         self.name=name
#
#     def __setattr__(self, key, value):
#         print('执行__setattr__')
#
# f1=Foo('alex')             # 执行__setattr__
# print(f1.__dict__)          #{}
# #执行了自己定义的__setattr__,并不会真正往字典属性里传值


#要求:往字典属性里传值,值必须是str类型
class Foo:
    def __init__(self,name):
        self.name=name

    def __setattr__(self, key, value):
        print('执行__setattr__')
        if type(value) is str:
            print('开始设置属性')
            # self.key=value          #又触发__setattr__
            self.__dict__[key]=value
        else:
            print('必须是字符串类型')

f1=Foo('alex')             # 执行__setattr__
f1.age=18
print(f1.__dict__)          #{}
View Code

 3.__delattr__

class Foo:
    def __init__(self,name):
        self.name=name

    def __delattr__(self, item):
        print('执行__delattr__')
        # f1.__dict__.pop(item)           #这样才会真正的删除

f1=Foo('alex')
f1.age=18
print(f1.__dict__)          #{'name': 'alex', 'age': 18}
del f1.age                  #执行__delattr__
print(f1.__dict__)          #{'name': 'alex', 'age': 18}
View Code

 

转载于:https://www.cnblogs.com/wuweixiong/p/10605829.html

__delattr__是Python中的一个特殊方法(也称为魔法方法),用于在删除实例属性时执行特定的逻辑。当我们删除一个实例的属性时,如果这个实例的类中定义了__delattr__方法,那么这个方法就会被调用。该方法的语法如下: ```python def __delattr__(self, name): # 执行特定的逻辑 ``` 其中,self是指当前实例对象,而name是要删除的属性的名称(以字符串形式)。在重写该方法时,我们可以添加自己的逻辑,但是如果想要真正删除属性,就需要调用父类的__delattr__方法。 请注意,当我们删除实例的__dict__属性时,也会触发__delattr__方法的执行。但是并不会真正删除该变量,而是进行了特殊处理。这是因为object类的__delattr__方法对__dict__属性进行了特殊处理。重写的__delattr__方法也可以进行类似的特殊处理。 综上所述,__delattr__方法是用于在删除实例属性时执行特定逻辑的特殊方法。它可以在类中进行重写,并通过调用父类的方法来实现属性的真正删除。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python __setattr__、 __getattr__、 __delattr__、__call__用法示例](https://download.youkuaiyun.com/download/weixin_38649657/12878817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [第8.32节 Python中重写__delattr__方法捕获属性删除](https://blog.youkuaiyun.com/LaoYuanPython/article/details/96881603)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值