是否可以将对象所属的所有者类称为属性?

时间:2018-08-31 06:11:58

标签: python

我不太确定这在python中是可能的(或类似的东西)。我想从作为此类属性的对象访问类的方法(或另一个对象)。

考虑以下代码:

class A():
  def __init__(self):
     self.b = B()
     self.c = C()
  def print_owner(self):
     print('owner')

class B():
  def __init__(self):
     pass
  def call_owner(self):
     self.owner().print_owner()

这样b作为类A的对象属性可以引用A的方法或属性吗?

或者类似地,b是否可以访问c

3 个答案:

答案 0 :(得分:11)

有可能。您可以将对A到B构造函数的引用传递给

...
    self.b = B(self)
...

class B:
    def __init__(self, a):
        self.a = a

因此,B.a将引用存储到其所有者A。

答案 1 :(得分:8)

可以有很多对对象B()的引用,而不仅仅是类A实例的引用。因此这是不可能的,因为它在您的代码中。 (好吧,您可以尝试修改程序,例如在内存中查找类A的所有实例,然后找到其属性b指向您的B实例的实例,但这是一个很糟糕的主意。)

您应在B实例中显式存储对所有者的引用。

答案 2 :(得分:2)

您在这里有两个选择。更好的可能是@Sianur suggests。它是简单,有效和明确的。给那个答案一个投票。

另一种选择是让拥有者自己对它的奴才施加压力。 B可以做类似的事情

def call_owner(self):
    if hasattr(self, 'owner'):
        self.owner().print_owner()
    else:
        print('I am free!')

同时,A会将owner属性设置为其自身:

def __init__(self):
    self.b = B()
    self.c = C()
    self.b.owner = self.c.owner = self

无论如何,如果您希望一个对象可以访问另一个对象,请将引用存储在可访问的位置。这里没有魔术。