1

クラスがあると想像してくださいA

class A(object):
    def __init__(self, x, y)
        self.x = x
        self.y = y

次に、 (ベースとしてではなく)Bによって初期化されるクラスと他のパラメーターを定義しますAA

class B(object):
    def __init__(self, a):
        if isinstance(a, A):
            self.a = a

A問題は、 に膨大な量の変数が定義されており、 でB頻繁に参照されると仮定するとB、 でこれらの変数を認識するAことBができるかどうかです。

self.x 

それよりも

self.a.x

?

この変数の自動継承が危険であり、破壊的である可能性さえあることは承知していますが、多くの余分なタイプを入力self.a.xすると少し不格好に見えます。この継承を一時的に、またはコードの小さなスニペットで有効にするオプションがあると便利です。

編集

__dict__methodsとを含む基本的にすべてを表示しfunctionsます。数値変数のみを保持できますか?

4

3 に答える 3

2

あなたは書ける:

class B(object):
    def __getattr__(self, attr):
        if hasattr(self.a, attr):
            return getattr(self.a, attr)
        else:
            return object.__getattribute__(self, attr)

の属性にアクセスするたびにB、その属性があるかどうかがチェックさaれます。もしそうなら、代わりにそれを返します。Bそうでない場合は、属性自体を検索します。

于 2012-05-24T21:25:19.583 に答える
1

(メソッドを含まないように更新):

class B(object):
    def __init__(self, a, g):
        if isinstance(a, A):
            for k,v in a.__dict__.iteritems():
                if not callable(v):
                    self.__dict__[k] = v
于 2012-05-24T21:24:18.153 に答える
1
class B(object):
    def __init__(self, a):
        self.__dict__.update(a.__dict__)

Python でのベスト プラクティスは、通常、型をチェックするのではなく、isinstance()「ダック タイピング」を使用することです。私はあなたが何をしているのか完全な詳細を知らないので、isinstance()チェックが必要な正当な理由があるかどうかはわかりませんが、上記のコードはそれなしで書きました。

Bこれにより、 のインスタンスと同じメンバ名で のインスタンスがセットアップされA、それらの名前にバインドされた同じ値の参照が設定されます。

于 2012-05-24T21:25:28.320 に答える