python内置属性__setattr__,__delattr__,__getattr__

三 __setattr__,__delattr__,__getattr__ 

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

    def __getattr__(self, item):
        print('----> from getattr:你找的属性不存在')


    def __setattr__(self, key, value):
        print('----> from setattr')
        # self.key=value #这就无限递归了,你好好想想
        self.__dict__[key]=value #应该使用它

    def __delattr__(self, item):
        print('----> from delattr')
        # del self.item #无限递归了
        self.__dict__.pop(item)

#__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__)

#__delattr__删除属性的时候会触发
f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)

#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx

lower的示例:

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

    def __getattr__(self, item):
        print('【%s】这个属性不存在!'%item)

    def __setattr__(self, key, value):
        # 设置值为str
        if type(value) is str:
            print('设置成功![%s,%s]'%(key,value))
            self.__dict__[key] = value
        else:
            print('[%s]不是是字符串'%value)

    def __delattr__(self, item):
        print('%s 不允许删除'%item)
        # print('执行了delattr',item)
        # self.__dict__.pop(item)



f1 = Foo('long')
# f1.age  # 【age】这个属性不存在!

# f1.age = 11
# print(f1.__dict__)

print(f1.__dict__)
del f1.name
print(f1.__dict__)

四 二次加工标准类型(包装)

包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)

class List(list): #继承list所有的属性,也可以派生出自己新的,比如append和mid
    def append(self, p_object):
        ' 派生自己的append:加上类型检查'
        if not isinstance(p_object,int):
            raise TypeError('must be int')
        super().append(p_object)

    @property
    def mid(self):
        '新增自己的属性'
        index=len(self)//2
        return self[index]

l=List([1,2,3,4])
print(l)
l.append(5)
print(l)
# l.append('1111111') #报错,必须为int类型

print(l.mid)

#其余的方法都继承list的
l.insert(0,-123)
print(l)
l.clear()
print(l)

二次加工标准类型(基于继承实现)

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖__getattr__方法

import time
class Open:
    def __init__(self,filename,mode='r',encoding='utf-8'):
        self.file = open(filename,mode,encoding=encoding)
        self.mode = mode
        self.encoding = encoding

    def __getattr__(self, item):
        return getattr(self.file,item) # 从系统的方法中找对应的方法

    def write(self,line):
        '''写入时,加入时间'''
        t = time.strftime('%Y-%m-%d %X')
        self.file.write('%s %s'%(t,line))

f = Open('a.txt','w+','utf-8')
print(f.write)
# f.write('a') # 先从自己类中查找,没有调用__getattr__,通过getattr()在系统提供的类中查找
# data = f.read()
# print(data)
f.write('cup好热\n')
f.write('aaaaaaaaa\n')

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,__delattr__是一个魔法方法,用于在清除实例属性时被捕获执行。通过重写__delattr__方法,我们可以在删除属性时添加自定义的逻辑。该方法的语法很简单,其中self是所有实例方法都必须有的第一个参数,属性是要删除的属性的名称。在重写该方法时,如果要实现真正的属性删除,必须调用父类的__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.csdn.net/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: 33.333333333333336%"] - *2* [第8.32节 Python中重写__delattr__方法捕获属性删除](https://blog.csdn.net/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: 33.333333333333336%"] - *3* [第8.31节 Python中使用__delattr__清除属性数据](https://blog.csdn.net/LaoYuanPython/article/details/96729822)[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: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值