-3

次のことを行うにはどうすればよいですか? b_class を宣言している間、b_class を常に直接インスタンス化するわけではなく、ライブラリによってインスタンス化されることに注意してください。

class a_class:
  def some_method(self):
    """
    get the class instance of b_class in which a_class is instantiated
    using that instance, get var1
    perform some action based on var1
    """

class b_class:
  var1 = "init by the constructor or a method"
  a_inst = a_class()
  """
  other attributes
  """
4

2 に答える 2

1

b_class呼び出すsome_methodとき、またはインスタンスを作成するときに、インスタンスへの参照を渡さないとできませんa_class

そのインスタンスへの参照をどこにでも格納できa_classます。そのため、Python では、インスタンス メソッド内で割り当てられている場所を知ることができません。

だから、これをしてください:

class a_class:
  def __init__(self, parent):
    self.parent = parent

  def some_method(self):
    self.parent.var1

class b_class:
  def __init__(self):
      self.var1 = "init by the constructor or a method"
      self.a_inst = a_class(self)

a_class親について「知っている」インスタンスになり、self.parentインスタンス変数を介してそれらを参照できるようになりました。

于 2013-01-25T23:41:22.170 に答える
0

この前に、次のように言っておきます。このようにしないでください。これは恐ろしく、非常に複雑なハックであり、Martijnがうまく説明しているように、インスタンスをインスタンス化するときにインスタンスa_classをインスタンスに渡すのが正しい方法です。b_class

a_classとは言うものの、各インスタンスが最大で1つのインスタンスに関連付けられるという仮定を考えるとb_class、ガベージコレクターに問い合わせることでそれを釣り上げることができます。

import gc

class A(object):
    def get_my_B(self):
        # iterate over objects that point to us
        for ref in gc.get_referrers(self):
            if type(ref) is dict:   # could be instance's __dict__
                instances = [x for x in gc.get_referrers(ref) if type(x) is B]
                # if we have been found in the __dict__ of exactly one instance
                # and that __dict__contains a reference to us, we found our B
                if len(instances) == 1:
                    if getattr(instances[0], "__dict__", None) is ref:
                        if ref.get("a", None) is self:
                            return instances[0]
        return None

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

b = B()
assert b.a.get_my_B() is b
于 2013-01-26T00:26:50.270 に答える