2013-07-16 3 views
3

В моем примере ниже в Python объект x 'has-an' object y. Я хотел бы иметь возможность ссылаться на методы x из y.
Я могу достичь этого, используя @staticmethod, однако мне не рекомендуется делать это.Композиция - Ссылка на другой класс в Python

Есть ли способ (ы) ссылаться на весь объект x из объекта y?

class X(object): 
    def __init__(self): 
     self.count = 5 
     self.y = Y() #instance of Y created. 

    def add2(self): 
     self.count += 2 

class Y(object): 
    def modify(self): 
     #from here, I wanna called add2 method of object(x) 


x = X() 
print x.count 
>>> 5 

x.y.modify() 
print x.count 
>>> # it will print 7 (x.count=7) 

Заранее спасибо.

ответ

9

Вам необходимо сохранить ссылку на объект, который имеет экземпляр объекта Y:

class X(object): 
    def __init__(self): 
     self.count = 5 
     self.y = Y(self) #create a y passing in the current instance of x 
    def add2(self): 
     self.count += 2 

class Y(object): 
    def __init__(self,parent): 
     self.parent = parent #set the parent attribute to a reference to the X which has it 
    def modify(self): 
     self.parent.add2() 

Пример использования:

>>> x = X() 
>>> x.y.modify() 
>>> x.count 
7 
+0

Ничего себе. Простота. Я никогда не думал о том, чтобы передать себя, чтобы возразить. Благодарю. Оно работает. – oneace

2

Может быть, это возможно для вас использовать наследование класса? Например:

class X(object): 
    def __init__(self): 
     self.count = 5 

    def add2(self): 
     self.count += 2 

class Y(X): 
    def __init__(self): 
     super(Y, self).__init__() 

    def modify(self): 
     self.add2() 


y = Y() # We now create an instance of Y which is a child class of 'super' class X 
y.modify() 
print(y.count) # 7 
+0

Да. Наследование - еще одна отличная схема его достижения. – oneace