from datetime import date, datetime
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 NonDataIntField:
#非数据属性描述符
def __get__(self, instance, owner):
return self.value class User:
age = IntField()
# age = NonDataIntField() '''
如果user是某个类的实例,那么user.age(以及等价的getattr(user,’age’))
首先调用__getattribute__。如果类定义了__getattr__方法,
那么在__getattribute__抛出 AttributeError 的时候就会调用到__getattr__,
而对于描述符(__get__)的调用,则是发生在__getattribute__内部的。
user = User(), 那么user.age 顺序如下: (1)如果“age”是出现在User或其基类的__dict__中, 且age是data descriptor, 那么调用其__get__方法, 否则 (2)如果“age”出现在user的__dict__中, 那么直接返回 obj.__dict__[‘age’], 否则 (3)如果“age”出现在User或其基类的__dict__中 (3.1)如果age是non-data descriptor,那么调用其__get__方法, 否则 (3.2)返回 __dict__[‘age’] (4)如果User有__getattr__方法,调用__getattr__方法,否则 (5)抛出AttributeError ''' # class User:
#
# def __init__(self, name, email, birthday):
# self.name = name
# self.email = email
# self.birthday = birthday
# self._age = 0
#
# # def get_age(self):
# # return datetime.now().year - self.birthday.year
#
# @property
# def age(self):
# return datetime.now().year - self.birthday.year
#
# @age.setter
# def age(self, value):
# #检查是否是字符串类型
# self._age = value if __name__ == "__main__":
user = User()
user.__dict__["age"] = "abc"
print (user.__dict__)
print (user.age)
# print (getattr(user, 'age'))
# user = User("bobby", date(year=1987, month=1, day=1))
# user.age = 30
# print (user._age)
# print(user.age)

最新文章

  1. 浅析Java中的final关键字(转载)
  2. C++学习笔记 宏 const 内联 枚举
  3. JS复杂对象克隆
  4. webform页面传值和删除修改
  5. delphi图形图像开发相关
  6. EasyUI datagrid自适应问题解决
  7. 使sublimetext3在ubuntu下可以打中文和在windows的dos命令行下正常显示中文
  8. Http学习之使用HttpURLConnection发送post和get请求(2)
  9. Apache FtpServer 实现文件的上传和下载
  10. Eclipse rap 富客户端开发总结(9) : rap上传与下载
  11. php生成文字水印和图片水印
  12. 注意&amp;&amp;前后两个表达式有顺序的差别
  13. TensorFlow总结
  14. A1120. Friend Numbers
  15. SQL学习(一.索引)
  16. 每日英语:China&#39;s Retirement Age Sets Experts at Odds
  17. [label][HTML5-APP]通过使用HTML5特性开发WebApp的Framework收集
  18. 【uoj#192】[UR #14]最强跳蚤 Hash
  19. centos7 中文乱码问题解决方法
  20. Jmeter入门11 使用Simple Controller组织接口测试用例

热门文章

  1. Java Sound Capture from Microphone working code
  2. Swift4.0复习操作符方法与操作符的定制
  3. robot:循环遍历数据库查询结果是否满足要求
  4. 【Tools】ModbusSlave 7.0和ModbusPoll 7.0官网最新软件+注册码
  5. cordon、drain、delete node区别
  6. 开发规范——MYSQL数据库
  7. 理解Hybrid接口的应用
  8. springboot 通过docker 打包编译镜像
  9. win10 linux Ubuntu 18.04更换国内源
  10. [EF] - &quot;已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭&quot; 之解决