Stonelee's Blog

如无必要,勿增实体

Python动态改变对象属性(热插拔)

分享到: 更多

运用非面向对象的技术,结合动态语言的特性,确实能实现许多很灵活的功能,

本文根据“Mixin 扫盲班 – 赖勇浩”文后 沈崴哥的代码

假设现有水果,需要描述它的属性:颜色,熟了没?直接上代码:

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
#coding=utf-8
class Instance:
    def __init__(self, *args):
        for m in args:
            m(self)

    def config(self, *args):
        for m in args:
            m(self)

#无参数的
def has_harvest(self):
    self.harvest = True

def has_not_harvest(self):
    self.harvest = False

#有参数的
def setColor(color):
    def method(self):
        self.color = color
    return method

apple = Instance(has_not_harvest, setColor('green'))
print 'harvest:%s;color:%s' % (apple.harvest, apple.color)

apple.config(has_harvest, setColor('red'))
print 'harvest:%s;color:%s' % (apple.harvest, apple.color)

结果如下:

1
2
harvest:False;color:green
harvest:True;color:red

如果想再添加一属性:能不能吃?,很简单,代码如下:

1
2
3
4
5
#再加一属性
def can_eat(self):
    self.eat = True
apple.config(has_harvest, setColor('red'), can_eat)
print 'harvest:%s;color:%s;eat:%s' % (apple.harvest, apple.color, apple.eat)

结果如下:

1
harvest:True;color:red;eat:True

用这种技巧动态增加对象方法非常方便,值得推荐

Comments