zoukankan      html  css  js  c++  java
  • 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']
    
  • 相关阅读:
    nest exception is java.sql.SQLException:ORA-01476:除数为0
    java.lang.NullPointerException: No FileItemFactory has been set.
    With as 必须跟select
    作为一项技艺的管理——Leo鉴书81
    faultString = "java.lang.NullPointerException : null"
    org.apache.commons.fileupload.FileUploadBase$InvalidContentTypeException
    PERL
    Error:Error #2174
    ArgumentError:Error #2004:某个参数无效
    SecurityError:Error:#2148
  • 原文地址:https://www.cnblogs.com/June-King/p/10596200.html
Copyright © 2011-2022 走看看