2010-10-28 105 views
1

希望這不是太基本的,但...Python:如何將對象從基類提升爲派生類?

假設我有一個基類PA(),我也派生類PAI()PAJ()等,這從基類繼承。

我想從實例化基類對象PA()

>>> from pamod import * 
>>> mypa = pa() 
>>> mypa 
<pamod.pa object at 0x28d4fd0> 
>>> 

...然後推動它(投它)派生類的基礎上,一些動作:

>>> mypa.do(this) 
>>> mypa 
<pamod.pai object at 0x28d4fd0> 
>>> 

凡基於所述值「這種」,邁帕足球俱樂部變爲從類PAI物體等

我知道我可以分配給對象的__class__

邁帕足球俱樂部。 __class__ = PAI

但是我想知道如果這真是最好的辦法。

在我的計劃,PAI(比如說)的每個實例會開始作爲基類PA的一個實例,因此PAI__init__方法可以以某種方式過載,我猜。

請參閱 this 討論。

Peter

+0

此外,請勿使用「import *」。 – Allen 2010-10-29 01:12:13

回答

5

這是一種可怕的方法,因爲您必須自己處理新屬性的初始化。在子類中編寫一個類方法,該方法返回一個新的實例,並複製相應的屬性。

+0

或者編寫你的'__init__',以便它可以選擇接受基類的一個實例。 – kindall 2010-10-29 01:53:03

+0

+1這正是OP所期望的正確方法。 – hughdbrown 2010-10-29 02:27:04

+0

+1 DIP是你的朋友http://en.wikipedia.org/wiki/Dependency_inversion_principle – 2010-10-29 20:46:40

0

我不明白。看起來像重新分配__class__讓我不必複製所有內容,這是好事,因爲我們正在談論一個巨大的(100億美元)數據量。

(我在這裏回答我的問題,所以我可以包括代碼)

這有什麼錯呢?實際上,「x」和「y」可能代表大量的數據。調用mypa.do(1)將mypa提升爲類pai的成員:

class pa(object): 
    def __init__(self): 
     self.x = 1.0 

    def do(self,i): 
     if i==1: 
      self.__class__ = pai 
      self.promote() 

class pai(pa): 
    def __init__(self): 
     pa.__init__(self) 
     self.promote() 

    def promote(self): 
     self.y = 2.0