zoukankan      html  css  js  c++  java
  • attr系列

    #__setattr__  赋值方法,即一旦遇到self.name=name,就会执行__setattr__方法
    #__delattr__ 删除方法,一旦遇到del self.name,就会执行__delattr__方法
    #__getattr__ 查询方法,一旦遇到res=self.name,取res的值,且self.name不存在时,
    #就会执行__getattr__方法.它与__setattr__和__delattr__不同.
    #attr系列与property的区别,
    #1.attr系列是定义在类中的函数,property是给定义在类中的函数做装饰器用
    #2.attr系列可以是对象的任何属性,但是property只能是被它装饰的函数
    #3.表现形式不一样,attr系列是__setattr__,__delattr__,__getattr__
    #property是,以sex()函数为例,@sex.setter,@sex.deleter,@property

    #attr系列的使用:
    #__setattr__(self,key,value) 在其定义的函数中赋值使用self__dict[key]=value
    #__delattr__(self,item)在其定义的函数中删除使用del self__dict[key]
    #__getattr__(self,item)在其定义的函数中查询,一般使用getattr(self,item)
    #注:这里的方法是指会自动传值的函数

    class Foo:
    def __init__(self,name): #2
    self.name =name #即给self.name进行赋值,就会自动执行__setattr__方法

    def __setattr__(self, key, value):#3
    if not isinstance(value,str):#判断value的类型是否是str型
    raise TypeError('must be str')#主动抛出异常,整个程序结束
    print('----setattr---key:%s,value:%s'%(key,value))
    print(type(key))
    # self.key(属性) = value #相当于setattr(self,key(字符串),vlaue)
    # setattr(self,key,value)相当于给self.key(属性)进行赋值,就会自动执行
    #__setattr__方法,所以进入一个死递归,即不能用该方法进行赋值.
    self.__dict__[key] =value#直接在self.__dict__字典中进行赋值

    def __delattr__(self, item): #12
    print('delattr:%s' %item)
    print(type(item))
    # delattr(self,item) #相当于del self.item(属性)
    # del self.item
    self.__dict__.pop(item)#相当于del self.__dict__[item]

    f1 =Foo('egon')#类的实例化,会自动执行__init__方法(如果有),运行__init__中的代码#1

    f1.age = '18'
    print(f1.__dict__)#f1的名称空间以字典的形式储存的
    del f1.age #删除f1.age,就会执行__delattr__方法(如果有),运行__delattr__中的#11
    print(f1.__dict__)
    """
    class Foo:
    def __init__(self,x):
    self.name =x
    #属性不存在的情况下才会触发
    def __getattr__(self, item):
    print('getattr--->%s %s'%(item,type(item)))

    f =Foo('egon')
    #print(f.name)
    print(f.xxxx)

    """
  • 相关阅读:
    锂电池充电!
    触电
    记录一次调试过程中烧毁电脑主板的经历!
    如何计算一个CPU的MIPS
    铜线的载流能力问题。
    用格西烽火串口助手制作程控命令协议!
    从qt编程看内存分区。
    贴片LED用法
    RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
    uboot学习——基于S3C2440的u-boot-1.1.6分析(一)
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/6758444.html
Copyright © 2011-2022 走看看