假设我有以下类:
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;)函数返回的实例提升为增强子类的实例。
答案 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'