2010-10-28 106 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