在运行时动态更改实例的类?

时间:2013-11-30 10:08:31

标签: python

我的一位同事向我展示了一些代码,我觉得这很有趣:

class A(object):
    def evolve(self):
        if self.foo > 10:
             self.__class__ = B

class B(A):
    def bar(self):
        print "I'm a B"

......这基本上就是它的要点。这个想法是在处理完其他计算之后在运行时“专门化”一个实例。我一直在思考它,即使它感觉不对(特别是对__class__的赋值),只要适当考虑类型层次结构,我就可以看到它没有任何问题。

在没有分配给__class__的情况下,是否有可能在Python中执行此操作?

同样,我没有看到太多错误,因为__class__的作业只会有效地改变分辨率顺序......不是吗?

2 个答案:

答案 0 :(得分:2)

执行此类操作的经典方法是Strategy Pattern。创建一组类似的类,然后主类充当外观,其方法将操作委托给包含的类/对象。

答案 1 :(得分:1)

您在此描述的是“技术上可行”的州或战略模式的实施。虽然这是合法的python代码,但我强烈反对它,除非作为最后的手段黑客攻击在你无法控制的部分代码中实例化的对象,甚至可能有更好的方法。

从个人经验(我用Python最具动态性的功能进行了大量实验)坚持更多常规实现状态和策略模式,使代码更具可读性,可测试性和可维护性。