0

Ok。私はこの質問の言い回しに苦労してきました。私はサブクラスを持っています。呼び出されたときに特定のことが真である場合、その基本クラスのインスタンスを作成したいと思います。__ new __ でこれを行いますか? もしそうなら、私はどうしますか?

これは私が意味することの例です:

import warnings
class A:
    def __init__(self, *args):
        self.val = list(args)
    def __str__(self):
        return "A"

class B(A):
    def __init__(self, *args):
        if len(args)==3:
           A.__init__(self, *args)
           return
        else:
            warnings.warn("Making an A object!")
            return A(*args)

    def __str__(self):
        return "B"
    def extramethod1(self):
        print "This method is only in a B object"

x = B(1, 2, 3)
Warning (from warnings module)
  File '/test.py', line 14
UserWarning: Making an A object!
y = B(1, 2)
print x, y
'A B'
y.extramethod1()
'This method is only in a B object'

また、これを行うときに B に警告を発行させるにはどうすればよいですか?

4

3 に答える 3

1

この前の質問を参照してください。それは逆の方向でこれを求めています:スーパークラスがサブクラスインスタンスを返す必要があるかどうか。ただし、答えは同じです。代わりにファクトリ関数を使用してください。

于 2012-09-17T07:48:02.427 に答える
0

__init__はNoneを返す必要があります!オブジェクトではありません!

別のアプローチを試すことができます。

def f(*largs,**kwargs):
    if (...):
        return A(*largs,**kwargs)
    return B(*largs,**kwargs)

x = f(1,2,3) 
y = f(1,2)  

最終的にBのfastaticmethodを作成して、クラスにバインドすることができます。

于 2012-09-17T07:46:50.543 に答える
0

それを行う動機に関係なく、Python では、クラス インスタンスを作成する呼び出しを行うたびに、次のように呼び出されます。

__call__クラスのメタクラスのメソッド。これは通常 " type.__call__ - カスタム メタクラスを使用してこれをオーバーライドすることはほとんどありません。

その関数は、クラスの__new__オブジェクトを呼び出します。__new__作成されたインスタンスであるオブジェクトを返します。これは、呼び出されたクラス、スーパークラス、サブブラス、またはその他の Python オブジェクトから取得できます。(メソッドに適切なステートメントNoneを含めるのを忘れた場合に発生するものを含めます。メタクラスのそれらは、新しいオブジェクトでメソッドを呼び出します。return__new____call____init__

あなたの目的のために行く簡単な方法は、あなたの__new__メソッドを書いて、あなたがより適切だと思ったときにそれを返すようにすることです。の戻り値__init__は常に無視されることに注意してください (したがってNone、コードを読んでいる人を誤解させないように暗黙的に指定する必要があります)。

于 2012-09-17T15:19:39.540 に答える