簡體   English   中英

如何將實例“提升”為子類?

[英]How to “promote” an instance to a subclass?

假設我有以下課程:

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!

...並假設出於某種原因,我想“推廣”一個Plain實例,以使其成為Fancy的實例。

我知道我可以隨時修改實例的__class__屬性:

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

...但是我從各種各樣的SO帖子(例如,這里,這里)收集到,這不是一件好事(至少在生產代碼中不是)。

是否存在將實例提升為子類的更具“生產價值”的方法?


FWIW,將我帶到這個問題的實際用例如下。 我正在使用實現Web服務客戶端的第3方庫。 該客戶端可以做的事情之一是返回各種類的實例。 這些類提供的方法很少,提供的方法很少。 我可以使用更多,更強大的方法輕松地為這些類編寫子類,但是為了使它們有用,我還需要為那些當前返回API原始類實例的API函數編寫包裝。 始終,該包裝程序只需將原始(“ wrappee”)函數返回的實例提升為我的增強子類的實例。

你當然可以用

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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM