1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
| #!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2012 Hsin-Yi Chen
# Author(s): Hsin-Yi Chen <ossug.hychen@gmail.com>
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
class Delegated(type):
def __new__(mbs, name, bases, dct):
cls = type.__new__(mbs, name, bases, dct)
def myget(self, k):
return getattr(self.context, k)
def myset(self, k, v):
if not hasattr(self, 'context'):
self.__dict__['context'] = v
if k != 'context':
setattr(self.context, k, v)
cls.__getattr__ = myget
cls.__setattr__ = myset
return cls
class Wrapper(object):
__metaclass__ = Delegated
def __init__(self, context):
self.context = context
def dump(self):
print 'the data is ' + repr(self.data)
class Result(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
result = Result(title='man ages', data=[1,2,3,4,5])
wrap_result = Wrapper(result)
wrap_result.dump()
wrap_result.title = 'girl args'
print result.title
|