-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

让我先说:不要这样做;这是一个可怕的、过于复杂的 hack,正确的方法是在实例化后者时将实例传递a_class给您的实例,正如 Martijn 很好地说明的那样。b_class

也就是说,假设您的每个a_class实例最多与一个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 回答