2016-12-27 2 views
-1

Я пытаюсь инициализировать функцию/метод прямо в init. поэтому self.y в классе A возвращает правильное значение 10. Или, может быть, использовать метод get_y в A?переменная инициализация в структуре класса

см. Приведенные ниже коды и комментарии. Благодаря

class A(object): 
    def __init__(self): 
     self.x = 5 
     self.y = None 
     # self.y = B.eval(self)?? # wants y to be a value obtained from B.eval() 
    def get_x(self): 
     return self.x 

    def get_y(self): 
     # wants y to be a value obtained from B.eval() 
     #return B.eval(self) ?? 

class B(object): 
    def eval(ClassA): 
     """ 
     :param ClassA: is an instance of A 
     :return: value 
     """ 
     return ClassA.get_x() + 5 


a = A() 
b = B() 
print(a.get_y()) # wants value 10 printed out here 
print(B.eval(a)) 
+1

Неясно, что вы просите. Что вы хотите знать? – UnholySheep

+1

Возможно, вы захотите изучить использование свойства 'property' -a - это атрибут, который автоматически запускает пользовательский код при его установке, получении или удалении: https://docs.python.org/2/library/functions. html # property – jez

+2

Не могли бы вы дать менее абстрактный пример того, чего вы пытаетесь достичь? В чем смысл «B» вообще? – jonrsharpe

ответ

0

Просто сделайте B.eval()classmethod, используя его в качестве метода декоратора в class B, как показано ниже:

class A(object): 
    def __init__(self): 
     self.x = 5 
     self.y = None 
     self.y = B.eval(self) 
    def get_x(self): 
     return self.x 

    def get_y(self): 
     return B.eval(self) 

class B(object): 
    @staticmethod # ADD THIS LINE 
    def eval(ClassA): 
     """ 
     :param ClassA: is an instance of A 
     :return: value 
     """ 
     return ClassA.get_x() + 5 

a = A() 
b = B() 
print(a.get_y()) # -> 10 
print(B.eval(a)) # -> 10 
+0

Спасибо за ответ. –

+0

Добро пожаловать. Это было необходимо, потому что 'eval()' не имеет аргумента 'self', и вы вызывали его без создания экземпляра:' B.eval (a) '. Заметьте, что этого недостаточно, если положить определение его в «класс B», а не просто сделать его автономной функцией (с именем, отличным от 'eval', чтобы избежать отключения встроенной функции с тем же именем). – martineau

Смежные вопросы