python 属性描述符

import numbers

class IntField: # 一个类只要实现了这个魔法函数,那么它就是属性描述符
    #数据描述符
    def __get__(self, instance, owner): # 在属性获取的时候会进入这个方法
        return self.value

    def __set__(self, instance, value): # 在属性设置的时候会进入这个方法
        if not isinstance(value, numbers.Integral):
            raise ValueError("int value need")
        if value < 0:
            raise ValueError("positive value need")
        self.value = value

    def __delete__(self, instance): # 在属性删除的时候会进入这个方法
        pass

class User:
    age = IntField() # 这里定义了的话 下面也可以调用

user = User()
print(user.age) # 这里会在实例中新创建一个age变量,但是类变量中的age保持不变

 

user = User(), 那么user.age 顺序如下:

(1)如果“age”是出现在User或其基类的__dict__中, 且age是data descriptor, 那么调用其__get__方法, 否则

(2)如果“age”不是data descriptor, 并且出现在user的__dict__中, 那么直接返回 obj.__dict__[‘age’], 否则

(3)如果“age”出现在User或其基类的__dict__中

(3.1)如果age是non-data descriptor,那么调用其__get__方法, 否则

(3.2)如果age不是数据描述符,返回User类中的 __dict__[‘age’]

(4)如果User有__getattr__方法,调用__getattr__方法,否则

(5)抛出AttributeError
posted @ 2019-06-17 11:03  下路派出所  阅读(439)  评论(0编辑  收藏  举报