2016-12-27 144 views
-1

我想在init中初始化一个函数/方法。 因此,类A中的self.y返回正确的值10.或者可能在A中使用方法get_y?类结构中的变量初始化

请参考下面的代码和注释。如图所示感谢

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”的使用 - 属性是一个在您设置,获取或删除时自动运行用户定义代码的属性: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)'。请注意,将它定义在'class B'中并不是简单地将它定义为独立函数(名称不同于'eval'以避免禁用具有相同名称的内置函数)。 – martineau