2014-03-26 52 views
0

我有两个类。 abPython类对象属性引用

a的方法之一中,我创建了一个类b的对象。类b属性之一具有一个功能。所以说我给了它一个随机函数,但是b类的这个函数是否可以访问类a的属性?即使我没有直接作为参数传递它?

class b: 
    def __init__(self): 
     self.attribute_function = None 

class a: 
    def __init__(self): 
     self.temp = 10 
     self.counter = 0 

    def temp(self): 
     obj = b() 
     obj.attribute_function = lambda self: self.counter < self.temp 
     return obj.attribute_function() 


if __name__ == "__main__": 
    #pass 
    obj = a() 
    print obj.temp() 

在上面的例子中,我试图提供一个非常简单的例子,你要是跑不过它,它不工作...

修改过的代码,类a应该是这样的:

class a: 
    def __init__(self): 
     self.temp = 10 
     self.counter = 0 

    def temp(self): 
     obj = b() 
     obj.attribute_function = lambda args: self.counter < self.temp 
     return obj.attribute_function(1) # i added this 1 to fill in arg 

回答

3

这工作:

class b: 
    def __init__(self): 
     self.attribute_function = None 

class a: 
    def __init__(self): 
     self._temp = 10 
     self.counter = 0 

    def temp(self): 
     obj = b() 
     obj.attribute_function = lambda self=self: self.counter < self._temp 
     return obj.attribute_function() 


if __name__ == "__main__": 
    obj = a() 
    print obj.temp() 

在问题你已经是self.temp = 10它影响了你的方法temp()

另一个问题:lambda self: self.counter < self._temp。你的lambda函数期待一个参数。但省略self不是一个好主意lambda : self.counter < self._temp,因为如果您拨打obj.attribute_function()某处self不可用或已更改 - 它不会找到self或使用其他selfself=self修复了这个问题。

但通常这样的魔法是反模式。告诉我们你想要达到什么目标,并且应该有更好的方法去做你想做的事。否则,这种代码将确保许多头痛。

我认为这是一个更好的解决方案(所谓的策略模式):

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

class A: 
    def __init__(self): 
     self._temp = 10 
     self.counter = 0 

    def temp(self): 
     return self.counter < self._temp 


if __name__ == "__main__": 
    obj = B(A()) 
    print obj.temp() 
+0

我对不好的示例代码表示歉意。我正在研究一个相当复杂的项目并且通过SO进行解释非常困难。但为了纠正我的错误,我的原始代码中'attribute_function'的'self'参数是完全不同的另一个参数。 'attribute_function'中的'self'引用完全来自创建者类的属性。 – user1234440

+0

请参阅我上面修改的代码;与你一起帮助我得到它。但只是为了确认,引用该类'a'的属性而不隐式地传入参数是正确的?这安全吗? – user1234440

+0

>但只是为了确认,引用该类的属性而不隐式传递参数的工作是否正确?这是安全吗?<它应该工作,这称为'关闭'。如果您需要,请考虑两次。唯一的想法我会做:'obj.attribute_function = lambda args,self = self:self.counter warvariuc

0

您的例子不工作,因为你必须在temp

已分配temp名称冲突既处理方法:

def temp(self): 

和属性:

self.temp = 10