10

ある関数から返された親オブジェクトを子クラスに変換する方法を知りたいのですが。

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を変更することはできません。機能をクラスAに実装できれば可能ですが、コードの構造上不可能です。

4

6 に答える 6

23

Pythonは「キャスト」をサポートしていません。を取り、それ自体を適切に初期化B.__init__()できるように書き込む必要があります。A

于 2012-04-05T14:24:31.043 に答える
8

私は、あなたのプログラムの設計に、これを行う必要があるという恐ろしい問題があると強く疑っています。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

これは、Bにメソッドがない限り機能します。これは__init__、明らかに、メソッド__init__が呼び出されることはないためです。

于 2012-04-05T14:28:28.350 に答える
3

あなたはこのようなものを実装したいと言いました:

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

しかし、実際に作成するのは、次のようなものです(最初にクラスまたは静的メソッドを作成することを意図していない限り)。

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

次に、を呼び出すことができますB.functionIneed(instance_of_A)(これは、メソッドに明示的に渡すself必要があることの利点の1つです。 )

于 2012-04-05T19:34:52.713 に答える
0

クラスを正しく定義していません。このようにする必要があります:

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

class B(A):
    def __init__(self):
        super(B,self).__init__()

    def functionIneed(self):
        pass

その後、あなたはすることができます

j=B()
j.fuctionIneed()

予想通り

あなたはinsを参照するのを忘れました

于 2018-04-13T15:18:13.917 に答える
0

箱の外で考えるだけ:

必要な関数を含む新しいクラスの代わりに、既存のクラスまたはインスタンスに関数を追加するだけではどうでしょうか。

これについては、既存のオブジェクトインスタンスへのメソッドの追加 に適切な説明があります。

于 2021-10-21T20:47:25.640 に答える
-1

どうですか:

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

ダックタイピングについて読んでください。

于 2012-04-10T17:13:03.080 に答える