如何促进"子类的实例?

时间:2016-07-30 14:14:01

标签: python class

假设我有以下类:

class Plain(object):
    def speak(self):
        print 'ho-hum'

class Fancy(Plain):
    def exult(self):
        print 'huzzah!'

plain = Plain()
plain.speak()
# ho-hum
plain.exult()
# ---------------------------------------------------------------------------
# AttributeError                            Traceback (most recent call last)
# <ipython-input-585-5f782c9ea88b> in <module>()
# ----> 1 plain.exult()
fancy = Fancy()
fancy.speak()
# ho-hum
fancy.exult()
# huzzah!

...并且假设由于某种原因,我想&#34;促进&#34; Plain的一个实例,以便它成为Fancy的实例。

我知道我可以随时修改实例__class__属性:

plain.__class__ = Fancy
plain.exult()
# huzzah!

...但我从各种SO帖子(例如,这里,这里)收集到这不是一件好事(至少在生产代码中没有)。

是否有更多&#34;生产代码值得&#34;将实例提升为子类的方法?

<子> FWIW,带给我这个问题的现实用例如下。我正在使用第三方库来实现Web服务的客户端。这个客户端可以做的事情是返回各种类的实例。这些类提供的方法非常少,而且它们提供的少数方法非常弱。我可以使用更多,更强大的方法轻松地为这些类编写子类,但为了使它们有用,我还需要为那些当前返回API实例的API函数编写包装器。原来的课程。总是,这个包装器只需要将原始(&#34; wrappee&#34;)函数返回的实例提升为增强子类的实例。

1 个答案:

答案 0 :(得分:3)

你当然可以使用

fancy = Fancy(plain)

并在Fancy的构造函数中定义,如果将Plain的实例作为参数给出,会发生什么。

示例

class Plain:
   def __init__(self, foo, bar):
       self.foo = foo
       self.bar = bar
       self.status = 'plain'

class Fancy:
    def __init__(self, something):
         if isinstance(something, Plain):
              self.foo = something.foo
              self.bar = something.bar
         self.status = 'fancy'