2012-04-05 7 views
4

いくつかの関数によって返された親オブジェクトを子クラスに変換する方法を知りたいと思います。親クラスから子クラスに変換する(継承する)方法は?

class A(object): 
    def __init__(): 
     pass 

class B(A): 
    def functionIneed(): 
     pass 

i = module.getObject()# i will get object that is class A 
j = B(i)# this will return exception 
j.functionIneed() 

私はクラスAにfunctionIneedを実装できますが、コードの構造上不可能です。 ありがとう

答えて

12

Pythonは「キャスト」をサポートしていません。 B.__init__()と書いて、Aを受け取り、適切に初期化する必要があります。

+1

これは私より優れた答えです。 –

3

私はあなたにこれが必要であるというあなたのプログラム設計にひどく間違った何かがあることを強い疑惑、否、信念を持っています。 Pythonでは、Javaとは異なり、非常に少数の問題でクラスを解決する必要があります。あなたが必要とする機能がある場合、単純にそれを定義します。

def function_i_need(a): 
    """parameter a: an instance of A""" 
    pass # do something with 'a' 

をしかし、私はあなたの関数、クラスのメソッドを作るからあなたを説得することができない場合、あなたはその__class__属性を設定することで、インスタンスのクラスを変更することができます

>>> class A(object): 
...  def __init__(self): 
...   pass 
... 
>>> class B(A): 
...  def functionIneed(self): 
...   print 'functionIneed' 
... 
>>> a = A() 
>>> a.functionIneed() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'A' object has no attribute 'functionIneed' 
>>> a.__class__ = B 
>>> a.functionIneed() 
functionIneed 

__init__が決して呼び出されないので、これはBが__init__メソッドを持たない限り動作します。

class B(A): 
    def functionIneed(): 
     pass 

しかし、(あなたが最初の場所でclassまたはstaticメソッドを作ることに意図されていない限り)本当に何を作ることになることより、このようなものです:

+1

私は、これまでより優れているかもしれない、あるいははるかに悪い可能性のある代替ソリューションについてブログに書きました。 '__class__'が奇妙で恐ろしく危険ですが、少なくともCPythonではうまくいくようです - [Python" Cast Constructor "](http://late.am/post/2012/04/05/) a-python-cast-constructor) – dcrosta

+1

@dcrostaその投稿を回答に変えてもよろしいですか?あなた知っている、linkrotなど –

2

あなたはこのような何かを実装したいと述べました:

class B(A): 
    def functionIneed(self): 
     pass 

B.functionIneed(instance_of_A)とすることができます。

i = module.getObject() # i will get object that is class A 
try: 
    i.functionIneed() 
except AttributeError: 
    # handle case when u have a bad object 

ダックタイピングにまで読む:についてどのように

関連する問題