描述符(

    技术2025-09-08  44

    描述符是什么

    描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议   __get__():调用一个属性时,触发   __set__():为一个属性赋值时,触发   __delete__():采用del删除属性时,触发 class String(object): def __init__(self, name): self.name = name def __get__(self, instance, cls): print("__get__", instance) if instance is None: return self return instance.__dict__[self.name] def __set__(self, instance, value): print("__set__", value) if not isinstance(value, str): raise TypeError('Expected a string') instance.__dict__[self.name] = value class Person: name = String('name') def __init__(self, name): self.name = name a = Person("天鸽") a.name = "天恩" print(a.name)

    运行输出:

    __set__ 天鸽 __set__ 天恩 __get__ <__main__.Person object at 0x0000027B2ABC2710> 天恩

    # https://www.cnblogs.com/Meanwey/p/9898222.html

    __getattr__,__setattr__

    (1)__getattr__(self, item):

    在访问对象的item属性的时候,如果对象并没有这个相应的属性,方法,那么将会调用这个方法来处理。。。这里要注意的时,假如一个对象叫fjs, 他有一个属性:fjs.name = “fjs”,那么在访问fjs.name的时候因为当前对象有这个属性,那么将不会调用__getattr__()方法,而是直接返回了拥有的name属性了

    (2)__setattr__(self, item, value):

    当试图对象的item特性赋值的时候将会被调用。

    class Student: def __getattr__(self, item): return item + ' is not exits' def __setattr__(self, key, value): print("__setattr__",key,value) self.__dict__[key] = value def __getitem__(self, item): print("__getitem__", item) return self.__dict__[item] def __setitem__(self, key, value): print("__setitem__", key, value) self.__dict__[key] = value s = Student() print(s.name) # 调用__getattr__方法 输出'name is not exits' s.age = 1 # 调用__setattr__ 方法 __setattr__ age 1 print(s.__dict__) # 輸出 {'age': 1} print(s.age) # 输出 1 print(s['age']) # 调用 __getitem__方法 输出1 s['name'] = 'tom' # 调用 __setitem__ 方法 print(s.__dict__) print(s.name) print(s["name"]) # 调用 __getitem__方法 输出 tom __getattr__为内置方法,当使用点号获取实例属性时,如果属性不存在就自动调用__getattr__方法 __setattr__当设置类实例属性时自动调用,如j.name=5 就会调用__setattr__方法 self.[name]=5 因为这个类是从dict继承来的,是dict的超类 所以 self[attr]=value 相当于调用dict的下标方法 与 a={} ; a[attr]=value意思一样 __getitem__(self,key):返回键对应的值。 __setitem__(self,key,value):设置给定键的值 __delitem__(self,key):删除给定键对应的元素。 __getattr__内置使用点号获取实例属性属性如 s.name,自调用__getattr__ __setattr__设置类实例属性 如s.name='tom',自调用__setattr__ __getitem__ 使用[]获取实例属性 如s['name'],自调用__getitem__ __setitem__ 使用[]设置实例属性如 s['name'] = 'tom' ,自调用__setitem__ __dict__ 为参数字典
    Processed: 0.012, SQL: 9