之前写过一篇:《Python 封装-实现 C#实体类》
过程比较复杂,代码一堆一堆的的
今天呢,再补发一个实测可用哦~
1 # -*- coding:utf-8 -*-
2
3 # @version: 1.0
4 # @author: ZhangZhipeng
5 # @date: 2015-07-13
6
7 from collections import namedtuple
8
9
10 class Entity(object):
11
12 """docstring for Entity"""
13
14 def __init__(self, class_name, columns, **kwargs):
15 super(Entity, self).__init__()
16 _columns = [i.strip() for i in columns.split(" ") if i.strip()]
17 _columns.extend(kwargs.keys())
18 columns = list(set(_columns))
19 entity = namedtuple(class_name, columns)
20 self._entity = entity(**kwargs)
21
22 def __getattribute__(self, key):
23 entity = super(Entity, self).__getattribute__("_entity")
24 try:
25 return super(Entity, self).__getattribute__(key)
26 except:
27 return getattr(entity, key)
28
29 def __setattr__(self, key, value):
30 if key == "_entity":
31 super(Entity, self).__setattr__("_entity", value)
32 return
33 entity = super(Entity, self).__getattribute__("_entity")
34 try:
35 # setattr(entity, key, value)
36 entity.__setattr__(key, value)
37 except:
38 super(Entity, self).__setattr__(key, value)
39
40
41 if __name__ == '__main__':
42 user = {"name": "zhipeng", "age": 20}
43 entity = Entity("user", "", **user)
44 print entity
45 # print dir(entity)
46 print entity.name, entity.age
47 # print entity.score
48
49 entity.score = 200
50 print entity.score
51
52 entity.name = 'zhang'
53 print entity.name
54
55 entity.sex = "boy"
56 print "sex:", entity.sex
57
输出如下:
zhangzhipeng@Earth:test$ python entity.py
<__main__.Entity object at 0x7f863f08c050>
zhipeng 20
200
zhang
sex: boy
可以把这个当作基类来用,
1 # -*- coding:utf-8 -*-
2
3 # @version: 1.0
4 # @author: ZhangZhipeng
5 # @date: 2015-07-13
6
7 from entity import Entity
8
9
10 class UserEntity(Entity):
11
12 """docstring for userEntity"""
13
14
15 if __name__ == '__main__':
16 user = {"name": "zhipeng", "age": 14}
17 user_entity = UserEntity("user", "", **user)
18 print user_entity
19 # print dir(user_entity)
20 print user_entity.name, user_entity.age
21 # print user_entity.score
22
23 user_entity.score = 200
24 print user_entity.score
25
26 user_entity.name = 'zhang'
27 print user_entity.name
28
29 user_entity.weibo = 'sina'
30 print user_entity.weibo
31
运行效果:
zhangzhipeng@Earth:test$ python user_entity.py
<__main__.UserEntity object at 0x7f8d38497950>
zhipeng 14
200
zhang
sina