【问题标题】:Dynamically change the class of an instance at runtime? [duplicate]在运行时动态更改实例的类? [复制]
【发布时间】:2013-11-30 10:08:30
【问题描述】:

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

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__ 的赋值),我也看不出有什么问题,只要正确考虑到类型层次结构。

有没有办法在 Python 中做到这一点而不分配给__class__

同样,我认为这并没有太大的问题,因为分配给__class__ 实际上只会改变解析顺序...不是吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    做这种事情的经典方法是Strategy Pattern。创建了一组类似的类,然后主类充当外观,其方法将操作委托给包含的类/对象。

    【讨论】:

    • 我已经和我的同事讨论过这个问题。问题是事先不知道完整的接口。这些项目充当了一个巨大的专有接口的抽象!把它全部抽象出来是不可行的。我们只需要一分钟的子集。我只是转发信息。我没有机会全面分析问题...
    【解决方案2】:

    您在此处描述的是状态或策略模式的“技术上可能”的实现。现在,虽然这是合法的 Python 代码,但我强烈建议不要使用它,除非作为最后手段破解在您无法控制的部分代码中实例化的对象,即使这样也可能有更好的方法。

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

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2011-11-27
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 2011-04-22
      相关资源
      最近更新 更多