• python面向对象内置方法关于属性篇


    1、关于__xxxattr__之__getattr__、__setattr__、__delattr__

    2、关于__xxxitem__之__getitem__、__setitem__、__delitem__

    起步之attr,(attribute属性),我们可以通过对象来调用属性,如果调用的属性存在,那么我们将会得到这个属性,如果这个属性不存在但是不会报错(前提是我们写了__getattr__方法),将会调用__getattr__方法,与之类似的还有__getattribute__方法,

    当我们在类中同时写了__getattr__和__getattribute__方法时,调用属性时将只会执行后者,无论这个属性是否存在都会执行,而__getattr__仅当属性不存在时才会被调用

    慢走之__setattr__,这个方法比较神奇,只要属性被赋值便会执行这个方法,当对象实例化时如果其中有属性被赋值便会执行该方法,当为对象添加新属性时也会执行这个方法。通过这个特性,我们可以对添加的属性进行定制,比如只能添加int类型或者str类型的。。。然而这里面有坑。当通过self.key = value方式添加新属性时,将会产生循环调用,导致报错,所以这时我们可以通过操作属性字典的方式进行添加新属性。

    完成之__delattr__,前面提到过属性的增删改查,当我们定义过__delattr__方法后,删除属性时将会调用该方法,此处有坑,不能在_delattr__方法内通过del self.item直接删除属性,否则还是会出现循环调用导致报错,多以还是通过操作字典的方式进行操作。

    
    class Foo2(object):
        def __init__(self):
            self.name = 'ajune'
    
        # 通过对象.属性的方式访问属性时才会调用
        def __getattr__(self, item):
            # 获取的属性不存在时将会调用该方法
            print('__getattr__被调用')
    
        # 当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,
        # 除非__getattribute__在执行过程中抛出异常AttributeError
        # def __getattribute__(self, item):
        #     # 无论属性是否存在都会调用该方法
        #     print('__getattribute__方法被调用')
    
        def __setattr__(self, key, value):
            print('__setattr__方法被调用')
            # self.__dict__[key] = value
            # self.key = value  # 产生循环调用,无法设置
            # 通过函数的实现,实现对设置的属性进行限定
            if type(value) is str:
                print('开始设置')
                # self.k=v #触发__setattr__
                self.__dict__[key] = value.upper()
            else:
                print('必须是字符串类型')
    
        def __delattr__(self, item):
            print('__delattr__方法被调用')
            # del self.item         # 循环调用,报错
            self.__dict__.pop(item)
    
    

    啊啊啊啊啊啊啊啊。开始了__xxxitem__,这些东西就一句话,只用通过字典调用的方式才会执行下列的方法,没错你没听错,字典,这时可以类当做字典了,有没有感到很神奇?

    
    class Fo1(object):
        # 通过字典的方式使用属性才会执行
        def __setitem__(self, key, value):
            print('__setitem__执行')
            self.__dict__[key] = value
    
        def __getitem__(self, item):
            print('__getitem__执行')
            return self.__dict__[item]
    
        def __delitem__(self, key):
            print('__delitem__执行')
            self.__dict__.pop(key)
    
    
    fo1 = Fo1()
    fo1['name'] = 'ajune'
    # print(fo1.name)  
    print(fo1['name'])
    del fo1['name']
    
  • 相关阅读:
    python之路---23 模块 os sys pickle json
    Fiddler抓包【7】_次要功能和第三方插件
    Fiddler抓包【6】_Fiddler Script
    Fiddler抓包【5】_Fiddler过滤
    Fiddler抓包【4】_重定向AutoResponder
    Fiddler抓包【3】_设置断点修改
    Fiddler抓包【2】_捕获设置
    Fiddler抓包【1】_介绍及界面概述
    CSS常见兼容问题以及解决办法
    webpack入门文档教程
  • 原文地址:https://www.cnblogs.com/June-King/p/10596200.html
Copyright © 2020-2023  润新知