2022年 11月 4日

【原创】python 实体类

之前写过一篇:《Python 封装-实现 C#实体类》 

过程比较复杂,代码一堆一堆的的

 

今天呢,再补发一个实测可用哦~

  1. 1 # -*- coding:utf-8 -*-
  2.  2
  3.  3 # @version: 1.0
  4.  4 # @author: ZhangZhipeng
  5.  5 # @date: 2015-07-13
  6.  6
  7.  7 from collections import namedtuple
  8.  8
  9.  9
  10. 10 class Entity(object):
  11. 11
  12. 12     """docstring for Entity"""
  13. 13
  14. 14     def __init__(self, class_name, columns, **kwargs):
  15. 15         super(Entity, self).__init__()
  16. 16         _columns = [i.strip() for i in columns.split(" ") if i.strip()]
  17. 17         _columns.extend(kwargs.keys())
  18. 18         columns = list(set(_columns))
  19. 19         entity = namedtuple(class_name, columns)
  20. 20         self._entity = entity(**kwargs)
  21. 21
  22. 22     def __getattribute__(self, key):
  23. 23         entity = super(Entity, self).__getattribute__("_entity")
  24. 24         try:
  25. 25             return super(Entity, self).__getattribute__(key)
  26. 26         except:
  27. 27             return getattr(entity, key)
  28. 28
  29. 29     def __setattr__(self, key, value):
  30. 30         if key == "_entity":
  31. 31             super(Entity, self).__setattr__("_entity", value)
  32. 32             return
  33. 33         entity = super(Entity, self).__getattribute__("_entity")
  34. 34         try:
  35. 35             # setattr(entity, key, value)
  36. 36             entity.__setattr__(key, value)
  37. 37         except:
  38. 38             super(Entity, self).__setattr__(key, value)
  39. 39
  40. 40
  41. 41 if __name__ == '__main__':
  42. 42     user = {"name": "zhipeng", "age": 20}
  43. 43     entity = Entity("user", "", **user)
  44. 44     print entity
  45. 45     # print dir(entity)
  46. 46     print entity.name, entity.age
  47. 47     # print entity.score
  48. 48
  49. 49     entity.score = 200
  50. 50     print entity.score
  51. 51
  52. 52     entity.name = 'zhang'
  53. 53     print entity.name
  54. 54
  55. 55     entity.sex = "boy"
  56. 56     print "sex:", entity.sex
  57. 57

输出如下:

zhangzhipeng@Earth:test$ python entity.py

<__main__.Entity object at 0x7f863f08c050>

zhipeng 20

200

zhang

sex: boy

 

可以把这个当作基类来用,

  1. 1 # -*- coding:utf-8 -*-
  2.  2
  3.  3 # @version: 1.0
  4.  4 # @author: ZhangZhipeng
  5.  5 # @date: 2015-07-13
  6.  6
  7.  7 from entity import Entity
  8.  8
  9.  9
  10. 10 class UserEntity(Entity):
  11. 11
  12. 12     """docstring for userEntity"""
  13. 13
  14. 14
  15. 15 if __name__ == '__main__':
  16. 16     user = {"name": "zhipeng", "age": 14}
  17. 17     user_entity = UserEntity("user", "", **user)
  18. 18     print user_entity
  19. 19     # print dir(user_entity)
  20. 20     print user_entity.name, user_entity.age
  21. 21     # print user_entity.score
  22. 22
  23. 23     user_entity.score = 200
  24. 24     print user_entity.score
  25. 25
  26. 26     user_entity.name = 'zhang'
  27. 27     print user_entity.name
  28. 28
  29. 29     user_entity.weibo = 'sina'
  30. 30     print user_entity.weibo
  31. 31

运行效果:

zhangzhipeng@Earth:test$ python user_entity.py

<__main__.UserEntity object at 0x7f8d38497950>

zhipeng 14

200

zhang

sina

 

参考《Convert Python dict to object?》