0

外部関数内にクラスを作成し、そのクラスを返す場合があります。クラスには指定された親クラスがあります。親クラスのクラスメソッドからそのクラス変数にアクセスできるようにしたいのですが、これらのメソッドはクラスの初期化時に呼び出されます。要約すると、他のハードコードされたクラス変数を初期化する前に使用できるように、クラス変数 (ハードコードされていない) を設定できる必要があります。

これを明確にするためのサンプルコードを次に示します。

class Parent(object):
    class_var = None

    @classmethod
    def get_class_var_times_two(cls):
        return cls.class_var * 2


def outer_function(class_var_value):

    class Child(Parent):
        other_var = Parent.get_class_var_times_two() # <-- at this point, somehow Child's class_var is set to class_var_value

これがPythonで可能かどうかはわかりません。おそらく、class_var_value を外部関数に渡す必要はありません。メタクラスを使用して、変数をクラス属性辞書に強制的に挿入しようとしましたが、other_var を初期化する前に設定されるように、Child に class_var を十分早く設定する方法がわかりませんでした。それが可能であれば、これはすべてうまくいくでしょう。どんな考えでも大歓迎です!

編集: other_var を遅延プロパティにすることも検討しましたが、それは私のユースケースのオプションではありません。

4

1 に答える 1

1

を呼び出すParent.get_class_var_times_two()と で関数が呼び出されるため、(関数を呼び出すコンテキストに関係なく)cls = Parentの値が使用されます。Parent.class_var

だから、あなたがしたいのは callChild.get_class_var_times_two()です。問題は、ブロックが終了Childするまで定義されないことです。classしたがって、次のようなことを行う必要があります (メタクラスを使用しない場合):

def outer_function(class_var_value):
    class Child(Parent):
        class_var = class_var_value
    Child.other_var = Child.get_class_var_times_two()
于 2012-09-08T02:33:03.737 に答える